Отсрочка комментариев
Самоссылочные модели
Если вы хотите сослаться на одну и ту же модель для создания связи во время объявления, необходимо объявить модель, на которую ссылается ссылка, как ForwardRef, так как класс не готов во время объявления, и Python по умолчанию не позволяет ссылаться на него.
Хотя может возникнуть желание использовать будущие комментарии или просто ссылаться на имя «», он не сработает, так как ormar предназначен для использования с явно объявленными ForwardRef.
Во-первых, необходимо импортировать необходимые ссылки из импорта.
1 | |
Теперь нам нужна образец модели и ссылка на ту же модель, которая будет использоваться для создания самоссылочных отношений.
1 2 3 4 5 6 7 8 9 10 11 | |
Это все просто. Но перед началом работы с моделью необходимо обновить ссылки вручную, чтобы они создали реальную модель.
!!!предупреждает, что при попытке использовать модель без обновления ссылки будет генерироваться исключение ModelError. Таким образом, в приведенном выше примере любой вызов, такой как следующий, приведет к исключению python # creation of model - exception await Person.objects.create(name="Test") # initialization of model - exception Person2(name="Test") # usage of model's QuerySet - exception await Person2.objects.get()
Чтобы обновить ссылку, вызывайте метод update_forward_refs для каждой модели, имеющей предыдущую ссылку, только после объявления всех связанных моделей.
Поэтому для того, чтобы наш предыдущий пример работал правильно, нам нужна только дополнительная строка.
1 2 3 4 5 6 7 8 9 10 11 12 | |
Конечно, для аргументов to и through можно сделать одно и то же действие с отношениями ManyToMany совершенно одинаковым образом.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | |
Взаимосвязи между моделями
Для связывания нескольких различных моделей друг с другом можно использовать те же механизмы и логику, что и самоссылочные модели.
Конечно, ormar создает обратную связь между двумя сторонами связи с использованием указанного (или по умолчанию) related_name.
Однако, если требуется наличие двух (или более) связей между любыми двумя моделями, которые по какой-либо причине должны храниться с обеих сторон (следовательно, объявлять одно отношение на одной модели и другое на второй модели), то для этого потребуется использовать Forwardref.
Рассмотрим простой пример ниже.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | |
!!! Внимание Помните, что, независимо от количества заданных связей, related_name должна быть уникальной в связанной модели.