如何从相关Django模型预取唯一值列表?

如何从相关Django模型预取唯一值列表?,django,postgresql,orm,Django,Postgresql,Orm,我想用尽可能少的查询预取Django中相关模型的唯一值列表 例如,考虑以下内容: class A(models.Model): b = models.ForeignKey('B') value = models.CharField(max_length=10) class B(models.Model): pass 我想用相关a对象中value列中的唯一值列表来注释B上查询集的每个模型实例 >>> qs = B.objects.all().annot

我想用尽可能少的查询预取Django中相关模型的唯一值列表

例如,考虑以下内容:

class A(models.Model):
    b = models.ForeignKey('B')
    value = models.CharField(max_length=10)

class B(models.Model):
    pass
我想用相关a对象中
value
列中的唯一值列表来注释B上查询集的每个模型实例

>>> qs = B.objects.all().annotate(distinct_a_values=...)
>>> [a.value for a in qs.first().a_set.all()]
["value_1", "value_2", "value_1"]
>>> qs.first().distinct_a_values
["value_1", "value_2"]
我能找到的最接近的方法是使用
预取
对象:

>>> qs = B.objects.all().prefetch_related(
        Prefetch(
            'a_set',
            A.objects.all().distinct('value').only('value', 'b_id'),
            to_attr='distinct_a_values'
        )
    )
它可以工作,但感觉很笨重,而且得到一个对象列表,却发现它们在主键之外的其他东西上是不同的,这肯定很奇怪


还有别的办法吗?

有没有评论为什么这项议案被否决了?我不知道为什么它被否决了。也就是说,我认为预取是最好的方法。您不需要all()部分,它是隐式完成的。我会在你跑步后改为跑步。