【发布时间】:2020-05-17 19:12:57
【问题描述】:
我想在一个查询集上有一个字段status,它是从一组预取的反馈值的函数派生的。
反馈示例:
feedback = [
{'action': 0, 'user': 1},
{'action': 1, 'user': 13},
]
如果我在序列化器上写这个,我会这样做:
def get_status(self, obj):
# Squash all feedback into single status value
fb = obj.feedback.all()
vals = [f.action for f in fb]
if len(vals) == 0:
return 0 # Unconfirmed
if sum(vals) == 0:
return 1 # Confirmed
return 2 # Rejected
但是我想将此逻辑下移到我的视图的查询集中以启用字段排序。
queryset = Foo.objects\
.prefetch_related('feedback')\
.annotate(status="???")
我想知道哪组可用的查询表达式可以模仿上面的python函数get_status的逻辑。
【问题讨论】:
-
您不能在
.annotate(..)中调用函数,因为数据库层不知道函数。您可以尝试将上述内容转换为表达式。顺便说一句,您不需要为此需要.prefetch_related(..)。
标签: python django-models django-rest-framework