如何将特定于实例的查询集附加到Django中的模型?

时间:2012-04-04 02:29:20

标签: django django-models django-templates django-queryset django-managers

我正在使用Django 1.4创建一个非常小的用户到用户消息传递应用程序。我想从我的模板中以直接的方式获取用户收到的未读消息。我的模型看起来像这样:

from django.contrib.auth.models import User

class Message(models.Model):
    sender = models.ForeignKey(User, related_name='messages_sent')
    receiver = models.ForeignKey(User, related_name='messages_received')
    read = models.BooleanField(default=False)

现在,我可以轻松访问用户从user.messages_received收到的消息。但是,我想过滤此查询集,以便以一种简单的方式快速访问未读消息。我知道我总是可以过滤查询集user.messages_received.filter(read=False),但我想直接在模板中找到它们,可能是这样的:

<a href="{% url inbox %}"> Inbox ({{ user.unread_messages.count }})</a>

我怀疑我想成为一名经理,但我不确定如何写它或在哪里附上它。

提前致谢。

1 个答案:

答案 0 :(得分:1)

有两种方法可以解决这个问题。

首先,您可以使用自定义函数扩展用户模型。

from django.contrib.auth.models import User

def unread_messages(self):
    return self.messages_received.filter(read=False)
User.add_to_class('unread_messages', unread_messages)

但这有点骇人听闻。 “干净”的方式不是直接扩展用户模型,而是为用户创建UserProfile 并在那里添加功能。 The docs很好地描述了这一点。

在你的情况下:

models.py

from django.db import models
from django.contrib.auth.models import User

class UserProfile(models.Model):
    user = models.OneToOneField(User)
    def unread_messages(self):
        return self.user.messages_received.filter(read=False)

settings.py

AUTH_PROFILE_MODULE = 'appname.UserProfile'

模板

{{ user.get_profile.unread_messages.count }}

代码未经测试,但应该有效:)