是否可以使用get_fieldname_display()作为注释值?

时间:2018-03-27 10:50:19

标签: python django django-queryset

是否可以使用get_fieldname_display()作为注释值?

queryset.filter(is_draft=True).annotate(status=get_status_display() ) 

如果是的话,我该怎么做呢,有没有pythonic或更好的方法来做到这一点?

1 个答案:

答案 0 :(得分:0)

您可以使用注释,但它会更复杂一些。首先,您必须在模型和查询中使用的单独变量中进行选择:

statuses = [
    ('status1', 'status display number 1'),
    ('status2', 'status display number 2'),
     # ...
]
class YourModel(models.Model):
    status = models.CharField(max_length=10, choices=statuses)
    # rest of your model

然后查询集看起来像这样:

from django.db.models import Case, Value, When

YourModel.objects.filter(
    is_draft=True
).annotate(
    status_display=zone_order=Case(
        *[When(status=s[0], then=Value(s[1])) for s in statuses],
        output_field=CharField()
    )
)

您也可以在管理器中使用此注释技巧来覆盖get_queryset。但是,我不知道这种方法对延迟翻译的影响。免责声明:我没有在现场翻译上测试,所以可能存在错误。