是否可以使用参数创建Django模型的托管属性(@property)

时间:2016-12-13 23:31:40

标签: django django-models

我的模型的函数取决于外部参数

class MyModel(models.Model):
    some_filed = ...

    @property
    def my_property(self, user=None):
        try:
            qs = OtherModel.objects.get(field1=self, user=user)
        except OtherModel.DoesNotExist:
            return None
        return qs.field2

所以我需要像my_property一样注释

MyModel.objects.all().annotate(field2=my_property(user=user))

1 个答案:

答案 0 :(得分:0)

你完全以错误的方式解决这个问题。正如我所说,你不能定义一个带参数的属性;定义一个方法的重点是你在没有调用括号的情况下直接引用它,所以实际上没有办法传递一个参数。并且使用注释在这里也没有意义;它定义了一个数据库操作,因此它不可能引用Python中定义的方法。

幸运的是,您实际需要的结果非常简单,并且不需要属性或注释。您只需使用标准查询语法:

MyModel.objects.filter(othermodel__user=user).order_by(othermodel__field2)