使用 annotate() 包含一个 django 模型对象属性



我有一个模型,其中包含一个我希望在执行以下操作时包含的@property vals = MyModel.objects.values() 另一篇 S/O 帖子建议这样做的方法是覆盖经理类的get_queryset方法,并增强对annotate(xtra_field=...)的调用。

问题是我找不到如何使用模型属性执行此操作的示例。 我试过这样的事情 super(SuperClass, self).get_queryset().annotate(xtra_fld=self.model.xtra_prop) 以及其中的许多变体,但没有一个奏效。

我认为问题是注释参数的 RHS 应该是什么?

(而且,是的,我知道还有其他更笨拙的方法可以做到这一点,比如迭代values()返回的内容并随时添加属性。 对我来说,这不是一个非常优雅(甚至 django(的解决方案。

除非你在数据库中生成属性值,否则你不能在不覆盖 django 的内部方法的情况下做到这一点——我建议不要这样做。

更优雅的解决方案可能是向自定义查询集添加一个额外的方法,该方法根据请求生成额外的字段:

from django.db import models
class AreaQuerySet(models.QuerySet):
def values_with_area(self, *fields):
# width & height are always required to calculate the area
fields = set(fields)
fields.update(['width', 'height'])
for row in self.values(*fields):
row['area'] = Widget.calculate_area(row['width'], row['height'])
yield row
class Widget(models.Model):
# ...
objects = AreaQuerySet.as_manager()
@classmethod
def calculate_area(cls, width, height):
return width * height
@property
def area(self):
return Widget.calculate_area(self.width, self.height)

最新更新