Как выразить отношения "один ко многим" в Django

Я определяю свои модели Django прямо сейчас, и я понял, что не было OneToManyField в типах полей модели. Я уверен, что есть способ сделать это, поэтому я не уверен, что я упускаю. У меня по существу есть что-то вроде этого:

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

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

в этом случае, каждый Dude может иметь несколько PhoneNumbers, но отношения должны быть однонаправленными, в том, что мне не нужно знать из 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/