在哪里放置适用于模型的方法

时间:2009-05-09 21:47:01

标签: python django

我正在使用Django。

我有一个名为Agrument的模型。争论有双方和所有者。我有一个函数返回某个用户的最新参数的一面。

喜欢o​​bj.get_current_side(用户名)

我已将此添加到实际的Argument模型中,如此

 def get_current_side(self, user):
        return self.argument_set.latest('pub_date').side

我开始认为这没有意义,因为可能没有参数的实例。这是一个我会使用类方法的地方吗?我想过创建一个util类,但我认为与Argument类关联是有意义的。

3 个答案:

答案 0 :(得分:2)

User模型上使用实例方法会更有意义:

def get_current_side(self):
    try:
        return self.arguments.latest('pub_date').side
    except User.DoesNotExist, e:
        return None

您可以通过扩展User模型来执行此操作,如下所述:

编辑:我不确定抛出哪个异常。

答案 1 :(得分:1)

这应该是自定义模型管理器上的方法:

# in models.py
class ArgumentManager(models.manager.Manager):
    def get_current_side(self, user):
        try:
            return self.filter(user=user).latest('pub_date').side
        except Argument.DoesNotExist:
            return None

class Argument(models.Model):
    # fields etc...

    objects = ArgumentManager()


# Calling:

side = Argument.objects.get_current_side(user)

另外,您可以扩展contrib.auth.user并在其上添加get_current_size()。但是在我对Django非常有信心之前我不会搞乱它。

BTW:本页面中的大部分代码都是错误的;例如,OP的snipplet上根本没有使用user变量。

答案 2 :(得分:0)

我认为你所寻找的是模特经理。

Django docs on managers与管理员可以将函数添加到模型类而不是模型实例。