Как выразить отношения "один ко многим" в Django
Я определяю свои модели Django прямо сейчас, и я понял, что не было OneToManyField
в типах полей модели. Я уверен, что есть способ сделать это, поэтому я не уверен, что я упускаю. У меня по существу есть что-то вроде этого:
class Dude(models.Model):
numbers = models.OneToManyField('PhoneNumber')
class PhoneNumber(models.Model):
number = models.CharField()
в этом случае, каждый Dude
может иметь несколько PhoneNumber
s, но отношения должны быть однонаправленными, в том, что мне не нужно знать из PhoneNumber
, который Dude
владеет им, как таковым, поскольку у меня может быть много разных объектов, которые владеют PhoneNumber
экземпляры, такие как Business
например:
class Business(models.Model):
numbers = models.OneToManyField('PhoneNumber')
что бы я заменить OneToManyField
(которого не существует) с в модели для представления такого рода отношений? Я прихожу из Hibernate/JPA, где объявление отношений "один ко многим" было так же просто, как:
@OneToMany
private List<PhoneNumber> phoneNumbers;
как я могу выразить это в Django?
4 ответов
для обработки отношений "один ко многим" в Django вам нужно использовать ForeignKey
.
документация по ForeignKey очень полная и должна ответить на все ваши вопросы:
https://docs.djangoproject.com/en/dev/ref/models/fields/#foreignkey
текущая структура в вашем примере позволяет каждому чуваку иметь один номер, и каждый номер принадлежит нескольким чувакам (то же самое с бизнесом).
Если вы хотите обратные отношения, вам нужно будет добавить два поля ForeignKey к вашей модели PhoneNumber, один для чувака и один для бизнеса. Это позволило бы каждому номеру принадлежать либо одному чуваку, либо одному бизнесу, и иметь чуваков и бизнес, способный владеть несколькими номерами. Думаю, это то, что вам нужно.
class Business(models.Model):
...
class Dude(models.Model):
...
class PhoneNumber(models.Model):
dude = models.ForeignKey(Dude)
business = models.ForeignKey(Business)
в Django отношение "один ко многим" называется ForeignKey. Однако он работает только в одном направлении, поэтому вместо класса 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
на Dude
объект d
С d.phonenumber_set.objects.all()
, а затем сделать то же самое для
вы можете использовать любой внешний ключ на многие стороны OneToMany
связь (т. е. ManyToOne
связи) или использовать ManyToMany
(С любой стороны) с уникальным ограничением.
чтобы быть более ясным - нет OneToMany в Django, только ManyToOne - который является Foreignkey, описанным выше. Вы можете описать отношение OneToMany с помощью Foreignkey, но это очень невыразительно.
хорошая статья об этом: https://amir.rachum.com/blog/2013/06/15/a-case-for-a-onetomany-relationship-in-django/