Эффективный доступ к "многим" со стороны "одного"
Рассматриваются следующие модели:
class ManySide(django.db.models.Model):
one_side = models.ForeignKey(
to=OneSide, on_delete=models.PROTECT, related_name="related_one_side"
)
class OneSide(django.db.models:model):
# not containing any field relevant here
def many_side_elements(self):
pass # ?
Что я должен включить в метод many_side_elements, чтобы вызов его из экземпляра OneSide модели перечислил набор элементов ManySide?
Официальная документация подразумевает, что если o является OneSide isntance, o.many_side_set.all() должно работать, но в shell.
Мое текущее решение заключается в следующем:
from django.apps import apps
[...]
def many_side_elements(self):
ManySideModel = apps.get_model('<app_name_here>', 'ManySide')
val = ManySideModel.objects.filter(one_side=self)
Но я опасаюсь, что это неэффективно, поскольку требует импорта другой Модели. На самом деле это вызвало сообщение об ошибке круговой зависимости в моем проекте, отсюда и использование get_model.
Есть ли лучший способ? Или xy_set должен работать в первую очередь? Тогда что я делаю не так?
Если вы создаете поле модели со связанным именем, связанное имя переопределяет _set queryset.
В вашем случае
o.related_one_side.all() должен работать без необходимости использования другого def.
См: https://docs.djangoproject.com/en/4.0/topics/db/queries/#following-relationships-backward
Вы можете переопределить имя FOO_set, установив параметр related_name в определении ForeignKey. Например, если модель Entry была изменена на blog = ForeignKey(Blog, on_delete=models.CASCADE, related_name='entries'), то приведенный выше код примера будет выглядеть следующим образом: b.entries.all()
.