Эффективный доступ к "многим" со стороны "одного"

Рассматриваются следующие модели:

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()

.
Вернуться на верх