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'
.