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())
Вернуться на верх