在下文中,产品通过贡献者包含许多作者,contributor.role_code
定义了对产品的确切贡献类型。是否可以使用Django ORM过滤下面的order_by()方法引用的贡献者?例如。我想仅由贡献者订购产品contributor.role_code in ['A01', 'B01']
。
Product.objects.filter(
product_type__name=choices.PRODUCT_BOOK
).order_by(
'contributor__writer__last_name' # filter which contributors it uses?
)
答案 0 :(得分:1)
您可以通过注释子查询来做到这一点:
contributors_for_ordering = Contributor.objects.filter( # 1
product=OuterRef('pk'),
role_code__in=['A01', 'B01'],
).values('writer__last_name')
queryset = Product.objects.filter(
product_type__name=choices.PRODUCT_BOOK
).annotate( # 2
writer_last_name=Subquery(contributors_for_ordering[:1]) # Slice [:1] to ensure a single result
).order_by( # 3
'writer_last_name'
)
但是请注意,这里有一个潜在的怪癖。如果某个产品的贡献者同时具有“ A01”和“ B01”,则我们无法控制将哪个订购者用于订购-我们将获得首先返回的那个数据库。您可以在order_by
上添加contributors_for_ordering
子句来解决该问题。
答案 1 :(得分:0)
要过滤特定值,请先构建您接受的值列表:
accepted_values = ['A01', 'B01']
然后过滤此列表中的值:
Product.objects.filter(
product_type__name=choices.PRODUCT_BOOK
).filter(
contributor__role_code__in=accepted_values
).order_by(
'contributor__writer__last_name'
)