试图在Django中获取多对多相关数据

时间:2014-02-11 18:53:45

标签: python django django-templates many-to-many

我正在Django建立一个网站,其中的消息有标签。您可以在下面看到我的models.py

class Message(models.Model):
    message_id = models.BigIntegerField(primary_key=True)
    user = models.ForeignKey(User)
    title = models.CharField(max_length=50)
    tags = models.ManyToManyField(Tag, blank=True, null=True)
    date_created = models.DateTimeField(auto_now_add=True)

    def get_tags(self, tag_id):
        return self.message.filter(tags__tag_id=tag_id)

class Tag(models.Model):
    tag_id = models.BigIntegerField(primary_key=True)
    tag_name = models.CharField(max_length=100)
    date_created = models.DateTimeField(auto_now_add=True)

这也是我的views.py。

popular_tags = Tag.objects.filter(messages__date_created__gt=now).annotate(num=Count('messages')).order_by('-num')[:25]

我在这里要做的是,我想显示消息数量最多的标签。在我这样做之后,我希望标签显示哪些消息具有该标签。所以我知道我不能在模板中进行查询过滤,这就是我在Message模型下添加get_tags的原因。因此,我尝试编写正确的模板,但我不确定它出了什么问题。

{% for q in popular_tags %}
    <tr>
        <td align="left"><h5>{{ q.tag_name }}</h5> </td>
        {% for m in message.get_tags %}
        <td align="left"><h5>{{ m.title }} </h5></td>
        {% endfor %}
    </tr>
{% endfor %}

我没有收到任何错误,只是在正确显示标签时没有显示任何消息。任何想法我应该如何以及在哪里修复?

2 个答案:

答案 0 :(得分:0)

你不需要任何特别的东西,Django的ORM会照顾它,cf https://docs.djangoproject.com/en/1.6/ref/models/relations/#related-objects-reference

以下内容应该有效:

{% for q in popular_tags %}
    <tr>
        <td align="left"><h5>{{ q.tag_name }}</h5> </td>
        {% for m in q.message_set.all %}
        <td align="left"><h5>{{ m.title }} </h5></td>
        {% endfor %}
    </tr>
{% endfor %}

答案 1 :(得分:-1)

您应该在Tag而不是Message中添加一个功能:

class Tag(models.Model):
    tag_id = models.BigIntegerField(primary_key=True)
    tag_name = models.CharField(max_length=100)
    date_created = models.DateTimeField(auto_now_add=True)

    def get_msgs(self):
        return Message.objects.filter(tags__tag_id=tag_id)

因此,模板应为:

{% for q in popular_tags %}
    <tr>
        <td align="left"><h5>{{ q.tag_name }}</h5> </td>
        {% for m in q.get_msgs %}
        <td align="left"><h5>{{ m.title }} </h5></td>
        {% endfor %}
    </tr>
{% endfor %}