Django queryset.values_list() кроме возврата кверисета внешнего ключа
Данные несколько простых моделей, включая одну с внешним ключом:
class Entry(models.Model):
blog = models.ForeignKey(Blog, on_delete=models.CASCADE)
headline = models.CharField(max_length=255)
body_text = models.TextField()
Если у меня есть произвольный набор объектов Entry, скажем my_entries_queryset Entry.objects.filter(...)
. Как я могу преобразовать его в набор связанных с ним объектов "blog" через внешний ключ?
Если я использую value_list my_entries_queryset.values_list('blog', flat=True)
это просто список идентификаторов блогов, а не Blog queryset, над которым я могу выполнять дальнейшие операции Blog-related queryset.
Единственный способ, который я могу придумать, это что-то вроде этого:
blog_ids = my_entries_queryset.values_list('blog', flat=True).distinct()
Blog.objects.filter(id__in=blog_ids)
Но я надеялся на что-то более прямолинейное или чистое.
Таким образом, вы получите набор запросов с одним единственным предложением:
blogs_queryseyt = Blog.objects.filter(id__in=my_entries_queryset.values_list('blog', flat=True).distinct())
Если я использую список значений my_entries_queryset.values_list('blog', flat=True), то это просто список идентификаторов блогов, а не кверисет Blog, с которым я могу выполнять дальнейшие операции кверисета, связанные с Blog.
Тогда используйте only()
:
for record in my_entries_queryset.only('blog'):
print(record.blog)
Кверисет Блога, с которым я могу выполнять дальнейшие операции с кверисетом, связанным с Блогом
Операции типа filter()
, annotate()
и т.д. доступны через связанные поля, поэтому я не уверен, зачем вам нужен именно blogs QS. Но это можно сделать с помощью подзапросов:
Blog.objects.filter(pk__in=Entries.objects.filter(...).distinct())