উত্তর:
OneToOneField(SomeModel)
এবং মধ্যে কিছু পার্থক্য আছে তা বুঝতে সাবধান হন ForeignKey(SomeModel, unique=True)
। জ্যাঙ্গোর সংজ্ঞা নির্দেশিকায় বলা হয়েছে :
OneToOneField
একের সাথে এক সম্পর্ক। ধারণার দিক থেকে, এই একটি অনুরূপ
ForeignKey
সঙ্গেunique=True
, কিন্তু "বিপরীত" সম্পর্ক পাশ সরাসরি একটি একক বস্তুর ফিরে আসবে।
OneToOneField
"বিপরীত" সম্পর্কের বিপরীতে , একটি ForeignKey
"বিপরীত" সম্পর্ক a প্রদান করে QuerySet
।
উদাহরণস্বরূপ, যদি আমাদের নিম্নোক্ত দুটি মডেল থাকে (নিচে পূর্ণ মডেল কোড):
Car
মডেল ব্যবহার OneToOneField(Engine)
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
e.car
কাজ করে?
ForeignKey
সঙ্গে ব্যবহার করতে চান ? আমি অন্যান্য প্রশ্নের মধ্যে দেখতে পাচ্ছি যে জ্যাঙ্গো এমনকি সতর্ক করে দিয়েছিল যে একটি সাধারণভাবে নিজের স্বার্থকে সবচেয়ে ভাল করে দেয়। বিপরীতে একাধিক উপাদান থাকতে পারে না, তাই না? unique=True
OneToOneField
OneToOneField
QuerySet
একটি বিদেশীকি এক-একের জন্য অনেকের জন্য, তাই কোনও গাড়ী অবজেক্টের অনেকগুলি চাকা থাকতে পারে, প্রতিটি চক্রের নিজস্ব কারটির সাথে একটি বিদেশী কী রয়েছে। একটি ওয়ানটোঅনফিল্ড একটি ইঞ্জিনের মতো হবে, যেখানে কোনও গাড়ীর অবজেক্টে একটি এবং কেবল একটি থাকতে পারে।
নতুন জিনিস শেখার সর্বোত্তম এবং কার্যকর উপায় হ'ল বাস্তব জগতের ব্যবহারিক উদাহরণগুলি দেখতে এবং অধ্যয়ন করা। মনে করুন মুহুর্তের জন্য আপনি জাঙ্গোতে এমন একটি ব্লগ তৈরি করতে চান যেখানে সাংবাদিকরা সংবাদ নিবন্ধগুলি লিখতে এবং প্রকাশ করতে পারে। অনলাইন সংবাদপত্রের মালিক তার প্রতিটি প্রতিবেদককে যতটা নিবন্ধ প্রকাশের অনুমতি দিতে চান তবে বিভিন্ন সাংবাদিকরা একই নিবন্ধটিতে কাজ করতে চান না। এর অর্থ হ'ল পাঠকরা যখন কোনও নিবন্ধ পড়বেন তখন তারা নিবন্ধের কেবল একজন লেখককে দেখতে পাবেন।
উদাহরণস্বরূপ: জন দ্বারা নিবন্ধ, হ্যারি দ্বারা নিবন্ধ, রিক দ্বারা নিবন্ধ আপনি হ্যারি ও রিকের নিবন্ধটি রাখতে পারবেন না কারণ বস দুটি বা ততোধিক লেখক একই নিবন্ধটিতে কাজ করতে চান না।
জাঙ্গোর সহায়তায় কীভাবে আমরা এই 'সমস্যা' সমাধান করতে পারি? এই সমস্যার সমাধানের মূল চাবিকাঠি হ'ল জাজানো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 syncdb
SQL কোড এক্সিকিউট এবং আপনার ডাটাবেসের মধ্যে আপনার অ্যাপের জন্য টেবিল তৈরি করার। তারপরে ব্যবহার করুন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
।
ওয়ানটোওফিল্ড (ওয়ান-টু-ওয়ান) বুঝতে পারে, অবজেক্ট ওরিয়েন্টেশনে, রচনার ধারণা, যখন ফরেনকি (এক থেকে বহু) একত্রিত হওয়ার সাথে সম্পর্কিত।
Patient
এবং Organ
। Patient
অনেকগুলি থাকতে পারে Organ
তবে Organ
একটিতে কেবল একটির অন্তর্ভুক্ত থাকতে পারে Patient
। Patient
মুছে ফেলা হলে সমস্ত Organ
গুলিও মুছে ফেলা হয়। এ ছাড়া তাদের অস্তিত্ব থাকতে পারে না Patient
।
এছাড়াও OneToOneField
চাবি অনুলিপি এড়াতে প্রাথমিক কী হিসাবে ব্যবহার করার জন্য দরকারী। কারওর মধ্যে অন্তর্নিহিত / স্পষ্টত অটোফিল্ড নাও থাকতে পারে
models.AutoField(primary_key=True)
তবে OneToOneField
পরিবর্তে প্রাথমিক কী হিসাবে ব্যবহার করুন ( UserProfile
উদাহরণস্বরূপ মডেলটি কল্পনা করুন ):
user = models.OneToOneField(
User, null=False, primary_key=True, verbose_name='Member profile')
আপনি যখন ওয়ানটোওফিল্ড অ্যাক্সেস করবেন তখন আপনি অনুসন্ধানের ক্ষেত্রটির মান পাবেন। এই উদাহরণে একটি বইয়ের মডেলের 'শিরোনাম' ক্ষেত্রটি ওয়ানটোওফিল্ড:
>>> 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
ওয়ানটোওফিল্ড: যদি দ্বিতীয় সারণির সাথে সম্পর্কিত হয়
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 এর পিকে মানের সাথে একাধিক রেকর্ড থাকতে পারে।