Django Queryset - получение связанных объектов

Я хотел бы получить связанные объекты каждого объекта в наборе запросов.

Пример:

from django.contrib.contenttypes.fields import GenericRelation
from django.db import models


class Synonym:
    value = models.CharField(max_length=100)

class Name:
    synonyms = GenericRelation(Synonym)

names = Name.objects.all()
synonyms = names.values_list('synonyms', flat=True)  # <- returns the database id but not the object

Но метод value_list возвращает только id объектов, входящих в кверисет.

Я мог бы сплющить вывод примерно так:

[synonym for name in list(names) for synonym in name.synonyms.all()]

Но мне интересно, есть ли способ напрямую получить объекты?

То, что вы уже перечислили здесь, правильно

qs = Name.objects.all()
[synonym for synonyms in list(qs) for synonym in synonyms]

Но может быть (Возможно) опитимизирован с помощью (Необходимо тестирование):

qs = Name.objects.all()
synonyms = []
for obj in qs:
    synonyms.extend(obj.synonyms.all())

Вы можете указать значение для related_query_name=… параметра [Django-doc]:

from django.contrib.contenttypes.fields import GenericRelation


class Name(models.Model):
    synonyms = GenericRelation(Synonym, related_query_name='name')

Затем вы можете получить элементы в обратном порядке, например, с помощью:

Synonym.objects.filter(name__isnull=False).distinct()

будет извлекать все Synonym со связанным объектом Name, тогда как, например,

Synonym.objects.filter(name__value__startswith='a').distinct()

получит все Synonym, для которых существует связанный Name объект, где value начинается с 'a'.

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