Я определяю свои модели Django прямо сейчас, и я понял, что OneToManyField
в типовых полях модели не было. Я уверен, что есть способ сделать это, поэтому я не уверен, что мне не хватает. По сути, у меня есть что-то вроде этого:
class Dude(models.Model):
numbers = models.OneToManyField('PhoneNumber')
class PhoneNumber(models.Model):
number = models.CharField()
В этом случае у каждого Dude
может быть несколько PhoneNumber
s, но отношение должно быть однонаправленным, так как мне не нужно знать о PhoneNumber
том, Dude
кому оно принадлежит, само по себе, поскольку у меня может быть много разных объектов, которые имеют PhoneNumber
экземпляры, такие как Business
for пример:
class Business(models.Model):
numbers = models.OneToManyField('PhoneNumber')
Чем бы я заменил OneToManyField
(чего не существует) в модели для представления такого рода отношений? Я пришел из Hibernate / JPA, где объявить отношения «один ко многим» было так же просто, как:
@OneToMany
private List<PhoneNumber> phoneNumbers;
Как я могу выразить это в Джанго?
источник
dude = models.ForeignKey(Dude, related_name='numbers')
вы можете использовать егоsome_dude_object.numbers.all()
для получения всех связанных номеров (если вы не укажете «related_name», по умолчанию будет «number_set»).В Django отношение один ко многим называется ForeignKey. Однако он работает только в одном направлении, поэтому вместо наличия
number
атрибута классаDude
вам понадобитсяМногие модели могут иметь
ForeignKey
одну другую модель, поэтому было бы правильно иметь второй атрибутPhoneNumber
такой, чтоВы можете получить доступ к
PhoneNumber
S дляDude
объектаd
сd.phonenumber_set.objects.all()
, а затем сделать так же дляBusiness
объекта.источник
ForeignKey
означает «один на один». Используя приведенный выше пример, у меня должно бытьDude
многоPhoneNumbers
прав?ForeignKey
только один к одному, если вы укажетеForeignKey(Dude, unique=True)
, так что с помощью приведенного выше кода вы получитеDude
с несколькимиPhoneNumber
s.PhoneNumber
. Теперь это начинает иметь смысл.ForeignKey
по сути, многие-к-одному, так что вам нужно сделать это задом наперед, чтобы получить один-ко-многим :)phonenumber_set
? Я не вижу, что это определено где-либо Это название модели, в нижнем регистре, с добавлением "_set"?Чтобы быть более понятным - в Django нет OneToMany, только ManyToOne - это Foreignkey, описанный выше. Вы можете описать отношение OneToMany с помощью Foreignkey, но это очень невыразительно.
Хорошая статья об этом: https://amir.rachum.com/blog/2013/06/15/a-case-for-a-onetomany-relationship-in-django/
источник
Вы можете использовать либо внешний ключ на многих сторонах
OneToMany
отношения (то есть наManyToOne
отношении), либо использоватьManyToMany
(на любой стороне) с уникальным ограничением.источник
django
достаточно умен. На самом деле нам не нужно определятьoneToMany
поле. Он будет автоматически сгенерированdjango
для вас :-). Нам нужно только определитьforeignKey
в связанной таблице. Другими словами, нам нужно только определитьManyToOne
отношение с помощьюforeignKey
.если мы хотим получить список колес конкретного автомобиля. мы будем использовать
python's
автоматически сгенерированный объектwheel_set
. Для автомобиляc
вы будете использоватьc.wheel_set.all()
источник
В то время как перекати ответ «s хороший, простой и функциональный, я думаю , что есть две вещи , которые он не решает.
Представьте структуру типов контента , которая предоставляет некоторые объекты, которые позволяют нам создать «универсальный внешний ключ» в модели PhoneNumber. Затем мы можем определить обратные отношения на чувак и бизнес
См. Документы для деталей, и, возможно, ознакомьтесь с этой статьей для быстрого обучения.
Кроме того, вот статья, которая выступает против использования общих FKs.
источник
Если модель «многие» не оправдывает создание модели как таковой (здесь это не так, но это может принести пользу другим людям), другой альтернативой может быть использование определенных типов данных PostgreSQL через пакет Django Contrib.
Postgres может иметь дело с массивом или JSON типов данных, и это может быть хороший обходной путь для обработки One-To-Many , когда много-х годов могут быть привязаны только к одному лицу в один .
Postgres позволяет вам получать доступ к отдельным элементам массива, что означает, что запросы могут быть очень быстрыми и избежать накладных расходов на уровне приложений. И, конечно же, Django реализует классный API для использования этой функции.
Он, очевидно, имеет недостаток, заключающийся в том, что он не переносим на другую базу данных, но я все же заслуживаю упоминания.
Надеюсь, что это может помочь некоторым людям, которые ищут идеи.
источник
Прежде всего, мы берем тур:
01) отношения один ко многим:
NB: Django не предоставляет никаких отношений OneToMany. Поэтому мы не можем использовать верхний метод в Django. Но нам нужно конвертировать в реляционную модель. Так что мы можем сделать? В этой ситуации нам необходимо преобразовать реляционную модель в обратную реляционную модель.
Вот:
реляционная модель = OneToMany
Итак, обратная реляционная модель = ManyToOne
Примечание: Django поддерживает отношения ManyToOne, а в Django ManyToOne представлена ForeignKey.
02) отношения многие-к-одному:
NB: ДУМАЙТЕ ПРОСТО !!
источник