将实例方法添加到使用相关模型的User对象

时间:2015-01-31 13:37:34

标签: python django django-models

我正在使用自定义用户模型,类似于documentation中的示例,我想将一些实例方法附加到此用户模型。

假设我还有其他一些模型,例如Items,Polls,ForumPost,BuySell,UpDownVote等,它们都具有用户模型的外键。

我想要实现的是一些自定义方法,我可以在用户对象上调用,例如,在摘要页面上。比如:

user.total_items()     - Counts the total items a user has
user.last_forum_post() - Last post the user has made
user.updown_vote_sum() - The sum of all Up and Down votes the user has retrieved

我如何实现这一目标?我如何以最好的方式实现它?

我想我可以在我的自定义用户模型中添加很多方法,然后执行类似 Items.objects.filter(user = self).count()的操作。但是,这是正确的做法吗?

1 个答案:

答案 0 :(得分:1)

使用backward relationships。例如:

def total_items(self):
    self.item_set.all().count()

如果你想在Items模型而不是User中编写逻辑,那么你必须在User的方法中导入这个模型:

def total_items(self):
    from items.models import Items
    return Items.objects.count_for_user(self)

Items模型/经理将是这样的:

class ItemsManager(models.Manager):

    def count_for_user(self, user):
        return self.filter(user=user).count()

class Items(models.Model):
    ...
    objects = ItemsManager()