添加字段到模型,作为注释

时间:2009-07-25 10:23:30

标签: django django-models

例如,我有一个模型帖子和评论。

Post.objects.annotate(Count('comment'))

我正在进行此类查询以获取每个帖子的评论数。但是在模板中我应该检查这个值是否大于4.我知道没有这样的模板标签。现在我把方法放在执行比较操作的模型中。

问题是,如何将字段放到模型作为注释呢?

3 个答案:

答案 0 :(得分:1)

模型只是类,而Python类实例是动态的。这意味着您可以通过简单地分配它来将您喜欢的任何属性添加到实例中。

myinstance = MyModel.objects.get(pk=1)
myinstance.mycomparisonattribute = True

然而,我不明白为什么这比使用比较方法更好。或者,使用可以进行比较的自定义模板标记 - SmileyChris的smart if标记非常好。

答案 1 :(得分:0)

您可以尝试使用自定义Manager 您可能应该尝试使用创建自定义管理器 已覆盖的get_query_set()方法,如here

所述

答案 2 :(得分:0)

有几种方法可以为类添加额外属性。如果它的属性只能计算一次并从那时起用作只读,我建议使用属性装饰器

例如:

@property
def foo(self):
    bar = do_some_calculation()
    return bar

但是,如果你想检查某种类型对象的数量,这是不可行的,因为它会随着时间的推移而发生变化。

管理器函数应该用于返回一组对象。如果要返回一个布尔值,指示帖子是否有超过4条注释,可以向模型添加一个函数:

def more_than_4_replies(self):
   return self.objects.count() > 4

您还可以使用聚合来注释传递给模板的对象集,并使用增强的if标记,如 smart-if pyif