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

时间:2016-10-10 09:22:15

标签: django postgresql orm

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

例如,请考虑以下事项:

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

class B(models.Model):
    pass

我希望在B上注释查询集的每个模型实例,并使用相关A对象中value列的唯一值列表。

>>> 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"]

我能找到的最接近的是使用Prefetch对象:

>>> qs = B.objects.all().prefetch_related(
        Prefetch(
            'a_set',
            A.objects.all().distinct('value').only('value', 'b_id'),
            to_attr='distinct_a_values'
        )
    )

它有效,但感觉很笨,获得一个A对象列表肯定很奇怪,只是发现它们与主键不同。

还有其他方式吗?

0 个答案:

没有答案