首页 > 解决方案 > 如何将QuerySet的注释值和Model的属性字段加入Django中的一个逻辑?

问题描述

我有这种情况。我通过两种方式计算直径:QuerySet 的注释和 Model 中的属性。

class CircleQuerySet(models.QuerySet):
    def annotate_diameter(self):
        return self.annotate(diameter=models.F('radius')*2)


class Circle(models.Model):
    radius = models.DecimalField(max_digits=11, decimal_places=2)

    objects = CircleQuerySet.as_manager()

    @property
    def diameter(self):
        return self.radius * 2

我怎样才能将这两种方式合二为一?它存在吗?

标签: django

解决方案


您可以setter为直径属性添加一个,以便在尝试添加同名注释时不会出错

@property
def diameter(self):
    return self.radius * 2

@diameter.setter
def diameter(self, value):
    return

至于只在一个地方进行计算,这是不可能的,因为注释是数据库指令,您仍然需要未从数据库中检索到的对象的属性。您可以通过覆盖管理器的方法将注释添加到每个查询,get_queryset以便甚至.get()返回带有注释的对象。


推荐阅读