我想在一个查询集中仅使用模型中某些字段的模板上使用get_status_display。
我有一个带有选择字段(状态)的模型。
class Operation(models.Model, ModelMixin):
operation_area = models.ForeignKey('operations.OperationArea', null=True)
created = models.DateTimeField(auto_now=True)
indication = models.NullBooleanField()
observation = models.TextField(blank=True, null=True)
rate = models.IntegerField(blank=True, null=True)
scheduling = models.DateTimeField(blank=True, null=True)
status = models.IntegerField(choices=OPERATION_TYPE)
class OperationArea(models.Model, ModelMixin):
campaign = models.ForeignKey('campaigns.Campaign')
person = models.ForeignKey('registrations.Person')
user = models.ForeignKey('authentication.User')
area = models.CharField(max_length=1, choices=OPERATION_AREA)
我的查询是:
Operation.objects.filter(operation_area__user=user).values('id', 'created', 'operation_area__person__name', 'status')
由此获得一个命令,但是get_FOO_dislpay是一个实例方法,不适用于该命令。我不想使用.only(),因为他带来了 operation_area 对象,并且为了获得 person.name 他要进行另一个查询,例如 operation.operation_area .person.name 。有什么想法如何使用一个查询和get_FOO_display吗?
答案 0 :(得分:0)
我认为 annotate()是您想要的。
使用提供的查询表达式列表注释QuerySet中的每个对象。表达式可以是简单值,也可以是对模型(或任何相关模型)上字段的引用,也可以是针对与对象中的对象相关的对象计算出的聚合表达式(平均值,总和等)。 QuerySet。
annotate()的每个参数都是一个注释,它将添加到返回的QuerySet中的每个对象中。
下面的“聚合函数”中介绍了Django提供的聚合函数。
使用关键字参数指定的注释将使用关键字作为注释的别名。匿名参数将基于聚合函数的名称和要聚合的模型字段为其生成别名。只有引用单个字段的聚合表达式才可以是匿名参数。其他所有内容都必须是关键字参数。
您应该使用:
SettingSection
看看https://docs.djangoproject.com/en/2.0/ref/models/querysets/#annotate。
答案 1 :(得分:0)
我知道现在答复已经太晚了。不过,我认为我的解决方案值得分享:
def display_value(choices,field):
options = [
When(**{field: k, 'then': Value(v) })
for k,v in choices
]
return Case(
*options,output_field=CharField()
)
您可以使用:
my_field = {'field_value': display_value(CHOICES, 'field'),}
YourModel.objects.annotate(**my_field)