【问题标题】:Django queryset.values_list() except returning a queryset of a foreign keyDjango queryset.values_list() 除了返回外键的查询集
【发布时间】:2021-10-14 11:31:12
【问题描述】:

给定一些简单的models,包括一个带有外键的:

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(...)。如何通过外键将其转换为关联“博客”对象的查询集?

如果我使用 value_list my_entries_queryset.values_list('blog', flat=True) 它只是一个博客 ID 列表,而不是一个博客查询集,我可以对它进行进一步的博客相关查询集操作。

我能想到的唯一方法是这样的:

blog_ids = my_entries_queryset.values_list('blog', flat=True).distinct()
Blog.objects.filter(id__in=blog_ids)

但我希望有更直接或更简洁的东西。

编辑

这就是我的目标:

def get_blogs_qs(entry_queryset):
   """ Return a queryset of the Blog objects from an
       arbitrary Entry queryset
   """
   # blogs_qs = ?
   return blogs_qs

【问题讨论】:

  • 您也可以将my_entries_queryset中的过滤器移动到Blog.objects.filter()。比如:Blog.objects.filter(entry_set__headline='someheadline')
  • 问题是这不适用于任意 Entry 查询集。
  • 什么意思?
  • 想象这是一个接受在别处构造的 Entry qs 的函数。我希望能够在 Entry 模型上采用任意 Queryset 并在 ForeignKey 模型上返回一个 Queryset。但这看起来很有希望? Blog.objects.filter(entry_set__in=some_entry_qs)
  • 也可以添加,这也是可能的:Blog.objects.filter(pk__in= my_entries_queryset.values('blog'))。无需区分

标签: python django django-queryset


【解决方案1】:

这样你就可以得到一个包含一个句子的查询集:

blogs_queryseyt = Blog.objects.filter(id__in=my_entries_queryset.values_list('blog', flat=True).distinct())

【讨论】:

    【解决方案2】:

    如果我使用 value_list my_entries_queryset.values_list('blog', flat=True) 它只是一个博客 ID 列表,而不是一个博客查询集,我可以对其进行进一步的博客相关查询集操作。

    然后使用only():

    for record in my_entries_queryset.only('blog'):
        print(record.blog)
    

    我可以做更多与博客相关的查询集操作的博客查询集

    filter()annotate() 等操作可通过相关字段获得,所以我不确定,为什么您需要专门的博客 QS。但这可以通过子查询来完成:

    Blog.objects.filter(pk__in=Entries.objects.filter(...).distinct())
    

    【讨论】:

      猜你喜欢
      • 2020-06-22
      • 1970-01-01
      • 2015-03-09
      • 2018-08-06
      • 2015-01-25
      • 2013-09-27
      • 1970-01-01
      • 2011-11-08
      • 1970-01-01
      相关资源
      最近更新 更多