জাঙ্গো ওয়ানটোওফিল্ড এবং ফরেনকির মধ্যে পার্থক্য কী?


উত্তর:


507

OneToOneField(SomeModel)এবং মধ্যে কিছু পার্থক্য আছে তা বুঝতে সাবধান হন ForeignKey(SomeModel, unique=True)জ্যাঙ্গোর সংজ্ঞা নির্দেশিকায় বলা হয়েছে :

OneToOneField

একের সাথে এক সম্পর্ক। ধারণার দিক থেকে, এই একটি অনুরূপ ForeignKeyসঙ্গে unique=True, কিন্তু "বিপরীত" সম্পর্ক পাশ সরাসরি একটি একক বস্তুর ফিরে আসবে।

OneToOneField"বিপরীত" সম্পর্কের বিপরীতে , একটি ForeignKey"বিপরীত" সম্পর্ক a প্রদান করে QuerySet

উদাহরণ

উদাহরণস্বরূপ, যদি আমাদের নিম্নোক্ত দুটি মডেল থাকে (নিচে পূর্ণ মডেল কোড):

  1. Car মডেল ব্যবহার OneToOneField(Engine)
  2. Car2 মডেল ব্যবহার ForeignKey(Engine2, unique=True)

এর মধ্যে থেকে python manage.py shellনিম্নলিখিতগুলি কার্যকর করুন:

OneToOneField উদাহরণ

>>> from testapp.models import Car, Engine
>>> c = Car.objects.get(name='Audi')
>>> e = Engine.objects.get(name='Diesel')
>>> e.car
<Car: Audi>

ForeignKeyসঙ্গে unique=Trueউদাহরণ

>>> from testapp.models import Car2, Engine2
>>> c2 = Car2.objects.get(name='Mazda')
>>> e2 = Engine2.objects.get(name='Wankel')
>>> e2.car2_set.all()
[<Car2: Mazda>]

কোড এর নকশা

from django.db import models

class Engine(models.Model):
    name = models.CharField(max_length=25)

    def __unicode__(self):
        return self.name

class Car(models.Model):
    name = models.CharField(max_length=25)
    engine = models.OneToOneField(Engine)

    def __unicode__(self):
        return self.name

class Engine2(models.Model):
    name = models.CharField(max_length=25)

    def __unicode__(self):
        return self.name

class Car2(models.Model):
    name = models.CharField(max_length=25)
    engine = models.ForeignKey(Engine2, unique=True, on_delete=models.CASCADE)

    def __unicode__(self):
        return self.name

5
@ মার্কপিনিয়ার: আমি যতদূর বুঝতে পেরেছি, ওয়ানটোয়ান ক্ষেত্রটি কেবল এটিই: এক-থেকে-এক one এটি চালু করা হবে না। এই উদাহরণটি দেখুন : কোনও জায়গায় কোনও রেস্তোঁরা হতে হবে না।
osa

21
এই উত্তরটি বলে "কিছু কিছু পার্থক্য রয়েছে" এবং তারপরে একটি পার্থক্যের নাম দেয়। অন্য কেউ আছে?
ক্রিস মার্টিন

6
আমি ক্রিসের মতোই ভাবছি। এটি কি কেবল সিনট্যাকটিক চিনি, কীভাবে ডেটা অ্যাক্সেস করা যায় তার মধ্যে কিছু অন্তর্নিহিত পার্থক্য রয়েছে, যার ফলে পারফরম্যান্সের পার্থক্য দেখা যায়?
কার্লোস

4
জ্যাঙ্গোর কোনও নিয়ম থাকতে পারে না এমন কোনও মৌলিক কারণ কি বিদেশী কী অনন্য এবং শূন্য না হলে e.carকাজ করে?
সিরো সান্তিলি 郝海东 冠状 病 六四 事件

4
সুতরাং ... যখন একটি এমনকি একটি চেয়ে একটি ForeignKeyসঙ্গে ব্যবহার করতে চান ? আমি অন্যান্য প্রশ্নের মধ্যে দেখতে পাচ্ছি যে জ্যাঙ্গো এমনকি সতর্ক করে দিয়েছিল যে একটি সাধারণভাবে নিজের স্বার্থকে সবচেয়ে ভাল করে দেয়। বিপরীতে একাধিক উপাদান থাকতে পারে না, তাই না? unique=TrueOneToOneFieldOneToOneFieldQuerySet
অ্যান্ডি

121

একটি বিদেশীকি এক-একের জন্য অনেকের জন্য, তাই কোনও গাড়ী অবজেক্টের অনেকগুলি চাকা থাকতে পারে, প্রতিটি চক্রের নিজস্ব কারটির সাথে একটি বিদেশী কী রয়েছে। একটি ওয়ানটোঅনফিল্ড একটি ইঞ্জিনের মতো হবে, যেখানে কোনও গাড়ীর অবজেক্টে একটি এবং কেবল একটি থাকতে পারে।


4
আপনাকে ধন্যবাদ, ডোজ ওয়ানটোওফিল্ড (কিছু মডেল) মানে ফরেনকে (সোমো মডেল, অনন্য = সত্য)?

9
হ্যাঁ: 'একটি ওয়ানটোঅনফিল্ড মূলত ফরেনকি-তে সমান, ব্যতিক্রম ছাড়া সর্বদা এটির সাথে একটি "অনন্য" সীমাবদ্ধতা বহন করে এবং বিপরীত সম্পর্কটি সর্বদা প্রত্যাবর্তিত বস্তুকে ফিরে আসে না (যেহেতু কেবলমাত্র সেখানে থাকবে), তার পরিবর্তে তালিকা। '
ড্যান ব্রেইন

1
একই ইঞ্জিন থাকা বেশ কয়েকটি গাড়ি সম্পর্কে কী?
ওলেগ বেলোসভ

3
@ ওলেগটিখোনভ তাদের কাছে একই ইঞ্জিন ডিজাইনের একটি অনুলিপি থাকতে পারে তবে আমি একটি উদাহরণ দেখতে চাই যেখানে বেশ কয়েকটি গাড়ি একই শারীরিক ইঞ্জিন ভাগ করছে।
ড্যান ব্রেন

3
এই উত্তরে শর্তাদি সম্পর্কে কিছুটা বিভ্রান্তি রয়েছে। : ForeignKey একটি একের সাথে অধিকের নয় তবে সরকারী জ্যাঙ্গো ডকুমেন্টেশন অনুযায়ী একটি অনেক-টু-এক সম্পর্ক নেই docs.djangoproject.com/en/2.0/ref/models/fields/...
Kutay Demireren

45

নতুন জিনিস শেখার সর্বোত্তম এবং কার্যকর উপায় হ'ল বাস্তব জগতের ব্যবহারিক উদাহরণগুলি দেখতে এবং অধ্যয়ন করা। মনে করুন মুহুর্তের জন্য আপনি জাঙ্গোতে এমন একটি ব্লগ তৈরি করতে চান যেখানে সাংবাদিকরা সংবাদ নিবন্ধগুলি লিখতে এবং প্রকাশ করতে পারে। অনলাইন সংবাদপত্রের মালিক তার প্রতিটি প্রতিবেদককে যতটা নিবন্ধ প্রকাশের অনুমতি দিতে চান তবে বিভিন্ন সাংবাদিকরা একই নিবন্ধটিতে কাজ করতে চান না। এর অর্থ হ'ল পাঠকরা যখন কোনও নিবন্ধ পড়বেন তখন তারা নিবন্ধের কেবল একজন লেখককে দেখতে পাবেন।

উদাহরণস্বরূপ: জন দ্বারা নিবন্ধ, হ্যারি দ্বারা নিবন্ধ, রিক দ্বারা নিবন্ধ আপনি হ্যারি ও রিকের নিবন্ধটি রাখতে পারবেন না কারণ বস দুটি বা ততোধিক লেখক একই নিবন্ধটিতে কাজ করতে চান না।

জাঙ্গোর সহায়তায় কীভাবে আমরা এই 'সমস্যা' সমাধান করতে পারি? এই সমস্যার সমাধানের মূল চাবিকাঠি হ'ল জাজানোForeignKey

নীচে পূর্ণাঙ্গ কোড যা আমাদের বসের ধারণাটি বাস্তবায়নের জন্য ব্যবহার করা যেতে পারে।

from django.db import models

# Create your models here.

class Reporter(models.Model):
    first_name = models.CharField(max_length=30)

    def __unicode__(self):
        return self.first_name


class Article(models.Model):
    title = models.CharField(max_length=100)
    reporter = models.ForeignKey(Reporter)

    def __unicode__(self):
        return self.title

চালান python manage.py syncdbSQL কোড এক্সিকিউট এবং আপনার ডাটাবেসের মধ্যে আপনার অ্যাপের জন্য টেবিল তৈরি করার। তারপরে ব্যবহার করুনpython manage.py shell অজগর শেলটি খুলতে ।

রিপোর্টার অবজেক্ট আর 1 তৈরি করুন।

In [49]: from thepub.models import Reporter, Article

In [50]: R1 = Reporter(first_name='Rick')

In [51]: R1.save()

আর্টিকেল অবজেক্ট এ 1 তৈরি করুন।

In [5]: A1 = Article.objects.create(title='TDD In Django', reporter=R1)

In [6]: A1.save()

তারপরে প্রতিবেদকের নাম জানতে নিম্নলিখিত টুকরো কোডটি ব্যবহার করুন।

In [8]: A1.reporter.first_name
Out[8]: 'Rick'

এখন নিম্নলিখিত অজগর কোড চালিয়ে রিপোর্টার অবজেক্ট আর 2 তৈরি করুন।

In [9]: R2 = Reporter.objects.create(first_name='Harry')

In [10]: R2.save()

এখন আর্টিকেল অবজেক্ট এ 1 এ আর 2 যুক্ত করার চেষ্টা করুন।

In [13]: A1.reporter.add(R2)

এটি কাজ করে না এবং আপনি একটি এট্রিবিউটআরার পেয়ে যাবেন বলেছিলেন যে 'রিপোর্টার' অবজেক্টটির কোনও 'অ্যাড' নেই।

আপনি দেখতে পারেন যে কোনও নিবন্ধ অবজেক্ট একাধিক রিপোর্টার অবজেক্টের সাথে সম্পর্কিত হতে পারে না।

আর 1 এর কি হবে? আমরা কি এটির সাথে একাধিক নিবন্ধ অবজেক্ট যুক্ত করতে পারি?

In [14]: A2 = Article.objects.create(title='Python News', reporter=R1)

In [15]: R1.article_set.all()
Out[15]: [<Article: Python News>, <Article: TDD In Django>]

এই ব্যবহারিক উদাহরণটি আমাদের দেখায় যে জাজানো ForeignKeyবহু-এক-এক সম্পর্কের সংজ্ঞা দেওয়ার জন্য ব্যবহৃত হয়।

OneToOneField এক থেকে এক সম্পর্ক তৈরি করতে ব্যবহৃত হয়।

আমরা reporter = models.OneToOneField(Reporter)উপরের মডেল.পি ফাইলটিতে ব্যবহার করতে পারি তবে এটি আমাদের উদাহরণে কার্যকর হতে পারে না কারণ কোনও লেখক একাধিক নিবন্ধ পোস্ট করতে পারবেন না।

প্রতিবার আপনি একটি নতুন নিবন্ধ পোস্ট করতে চাইলে আপনাকে একটি নতুন রিপোর্টার অবজেক্ট তৈরি করতে হবে। এটি সময় সাপেক্ষ, তাই না?

আমি উদাহরণস্বরূপ চেষ্টা করে OneToOneFieldএবং পার্থক্যটি অনুধাবন করার জন্য সুপারিশ করছি । আমি নিশ্চিত যে এই উদাহরণের পরে আপনি পুরোপুরি জাজানো OneToOneFieldএবং জাঙ্গোর মধ্যে পার্থক্যটি জানতে পারবেন ForeignKey


আমি এই পছন্দ। ওয়ানটোন এবং ফরেনকে-র মধ্যে মৌলিক পার্থক্য এক থেকে এক এবং অনেকের মধ্যে একটির সম্পর্ক। আপনি ফরেনকে এবং অনন্য = এক-করতে-করতে সত্য ব্যবহার করতে পারেন, ম্যাথিউয়ের উত্তরে সূক্ষ্ম পার্থক্য বর্ণিত হয়েছে।
ফ্রাঙ্কজু

13

ওয়ানটোওফিল্ড (ওয়ান-টু-ওয়ান) বুঝতে পারে, অবজেক্ট ওরিয়েন্টেশনে, রচনার ধারণা, যখন ফরেনকি (এক থেকে বহু) একত্রিত হওয়ার সাথে সম্পর্কিত।


3
দুর্দান্ত উপমা, তবে সবসময় এর মতো হয় না। কিছু প্রান্তের কেস রয়েছে যা এই ব্যাখ্যায় ফিট করে না। এর উদাহরণস্বরূপ বলা যাক আমাদের ক্লাস আছে Patientএবং OrganPatientঅনেকগুলি থাকতে পারে Organতবে Organএকটিতে কেবল একটির অন্তর্ভুক্ত থাকতে পারে PatientPatientমুছে ফেলা হলে সমস্ত Organগুলিও মুছে ফেলা হয়। এ ছাড়া তাদের অস্তিত্ব থাকতে পারে না Patient
সিজার

4

এছাড়াও OneToOneFieldচাবি অনুলিপি এড়াতে প্রাথমিক কী হিসাবে ব্যবহার করার জন্য দরকারী। কারওর মধ্যে অন্তর্নিহিত / স্পষ্টত অটোফিল্ড নাও থাকতে পারে

models.AutoField(primary_key=True)

তবে OneToOneFieldপরিবর্তে প্রাথমিক কী হিসাবে ব্যবহার করুন ( UserProfileউদাহরণস্বরূপ মডেলটি কল্পনা করুন ):

user = models.OneToOneField(
    User, null=False, primary_key=True, verbose_name='Member profile')

3

আপনি যখন ওয়ানটোওফিল্ড অ্যাক্সেস করবেন তখন আপনি অনুসন্ধানের ক্ষেত্রটির মান পাবেন। এই উদাহরণে একটি বইয়ের মডেলের 'শিরোনাম' ক্ষেত্রটি ওয়ানটোওফিল্ড:

>>> from mysite.books.models import Book
>>> b = Book.objects.get(id=50)
>>> b.title
u'The Django Book'

আপনি যখন কোনও বিদেশী কী অ্যাক্সেস করেন তখন আপনি সম্পর্কিত মডেল অবজেক্টটি পাবেন, যারপরে আপনি এরপরে আরও জিজ্ঞাসা করতে পারেন। এই উদাহরণে একই বইয়ের মডেলটির 'প্রকাশক' ক্ষেত্রটি ফরেনকে (প্রকাশক শ্রেণীর মডেল সংজ্ঞার সাথে সম্পর্কিত):

>>> b = Book.objects.get(id=50)
>>> b.publisher
<Publisher: Apress Publishing>
>>> b.publisher.website
u'http://www.apress.com/'

ফরেনকে-র ক্ষেত্রের ক্যোয়ারীগুলি অন্যভাবেও কাজ করে, তবে সম্পর্কের অ-প্রতিসম প্রকৃতির কারণে এগুলি কিছুটা আলাদা।

>>> p = Publisher.objects.get(name='Apress Publishing')
>>> p.book_set.all()
[<Book: The Django Book>, <Book: Dive Into Python>, ...]

পর্দার আড়ালে, বুক_সেটটি কেবল একটি ক্যোয়ারীসেট এবং অন্য যে কোনও ক্যোয়ারীসেটের মতো ফিল্টার এবং টুকরো টুকরো করা যায়। লোকেটের মডেল নাম _set এ যুক্ত করে বিশিষ্ট নাম book_set উত্পন্ন হয় generated


1

ওয়ানটোওফিল্ড: যদি দ্বিতীয় সারণির সাথে সম্পর্কিত হয়

table2_col1 = models.OneToOneField(table1,on_delete=models.CASCADE, related_name='table1_id')

টেবিল 2-এ টেবিল 1 এর পিকে মানের সাথে সম্পর্কিত কেবল একটি রেকর্ড থাকবে, যেমন টেবিল 2_col1 এর টেবিলের পিকে সমান অনন্য মান থাকবে

table2_col1 == models.ForeignKey(table1, on_delete=models.CASCADE, related_name='table1_id')

টেবিল 2-এ টেবিল 1 এর পিকে মানের সাথে একাধিক রেকর্ড থাকতে পারে।


1

ফরেনকি আপনাকে সাবক্লাসগুলি গ্রহণ করার অনুমতি দেয় এটি অন্য শ্রেণীর সংজ্ঞা কিন্তু ওয়ানটোওফিল্ডস এটি করতে পারে না এবং এটি একাধিক ভেরিয়েবলের সাথে সংযুক্তযোগ্য নয়

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.