【发布时间】: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