django - واحد - كيفية التعبير عن علاقة رأس بأطراف في دجانجو




مثال على علاقة واحد الى متعدد (2)

في Django ، تسمى علاقة رأس بأطراف ببرنامج ForeignKey. إنه يعمل فقط في اتجاه واحد ، ولكن بدلاً من وجود سمة number من فئة Dude ستحتاج

class Dude(models.Model):
    ...

class PhoneNumber(models.Model):
    dude = models.ForeignKey(Dude)

يمكن أن تحتوي العديد من النماذج على ForeignKey على نموذج آخر ، لذلك سيكون من الصحيح أن يكون لديك خاصية ثانية من PhoneNumber

class Business(models.Model):
    ...
class Dude(models.Model):
    ...
class PhoneNumber(models.Model):
    dude = models.ForeignKey(Dude)
    business = models.ForeignKey(Business)

يمكنك الوصول إلى PhoneNumber s للحصول على كائن d مع d.phonenumber_set.objects.all() ، ثم القيام بالمثل بالنسبة إلى كائن Business .

أقوم بتعريف نماذج Django الخاصة بي الآن وأدركت أنه لم يكن هناك OneToManyField في أنواع الحقول النموذجية. أنا متأكد من أن هناك طريقة للقيام بذلك ، لذلك لست متأكدًا مما أفقده. لديّ شيئًا من هذا القبيل:

class Dude(models.Model):
    numbers = models.OneToManyField('PhoneNumber')

class PhoneNumber(models.Model):
    number = models.CharField()

في هذه الحالة ، يمكن أن يكون لكل Dude عدة PhoneNumber ، ولكن يجب أن تكون العلاقة غير أحادية الاتجاه ، حيث لا أحتاج إلى معرفة من PhoneNumber الذي يمتلكه Dude ، في حد ذاته ، حيث قد يكون لدي العديد من الكائنات المختلفة التي تمتلك حالات PhoneNumber ، مثل Business على سبيل المثال:

class Business(models.Model):
    numbers = models.OneToManyField('PhoneNumber')

ما الذي يمكنني استبدال OneToManyField (غير موجود) في النموذج لتمثيل هذا النوع من العلاقة؟ أنا قادم من Hibernate / JPA حيث أن إعلان علاقة رأس بأطراف كان سهلاً مثل:

@OneToMany
private List<PhoneNumber> phoneNumbers;

كيف يمكنني التعبير عن هذا في Django؟


للتعامل مع علاقات رأس بأطراف في Django تحتاج إلى استخدام ForeignKey .

الوثائق الخاصة بـ ForeignKey شاملة للغاية ويجب أن تجيب على جميع الأسئلة التي لديك:

https://docs.djangoproject.com/en/dev/ref/models/fields/#foreignkey

البنية الحالية في المثال الخاص بك تسمح لكل Dude أن يكون لها رقم واحد ، وينتمي كل رقم إلى Dudes متعددة (نفسه مع Business).

إذا كنت تريد العلاقة العكسية ، فستحتاج إلى إضافة حقلين ForeignKey إلى نموذج PhoneNumber الخاص بك ، واحد إلى Dude و واحد إلى Business. وهذا من شأنه أن يسمح لكل رقم بالانتماء إلى أحد المتابعين أو شركة واحدة ، ويكون لدى Dudes والأعمال التجارية القدرة على امتلاك أرقام متعددة. أعتقد أن هذا قد يكون ما أنت عليه بعد

class Business(models.Model):
    ...
class Dude(models.Model):
    ...
class PhoneNumber(models.Model):
    dude = models.ForeignKey(Dude)
    business = models.ForeignKey(Business)






django-models