我想在尽可能少的查询中从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对象列表肯定很奇怪,只是发现它们与主键不同。
还有其他方式吗?