我正在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 %}
我没有收到任何错误,只是在正确显示标签时没有显示任何消息。任何想法我应该如何以及在哪里修复?
答案 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 %}