首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Django中显示多到多关系的元素?

如何在Django中显示多到多关系的元素?
EN

Stack Overflow用户
提问于 2013-09-26 19:02:26
回答 2查看 85关注 0票数 0

我有以下几种模式:

代码语言:javascript
复制
class Topic(models.Model):
    title = models.CharField(max_length=140)

    def __unicode__(self):
        return self.title
    class Meta:
        verbose_name = _('topic')
        verbose_name_plural = _('topics')

class TopicLabel(models.Model):
    name = models.CharField(max_length=256)
    order = models.IntegerField(null=True, blank=True)

    def getTopics():
        return TopicLabelConnection.objects.filter(labelId=self.id).orderby('order')

    def __unicode__(self):
        return self.name


class TopicLabelConnection(models.Model):
    topicId = models.ForeignKey(Topic, related_name='connection_topic')
    labelId = models.ForeignKey(TopicLabel, related_name='connection_label')

    def __unicode__(self):
        return self.labelId.name + ' / ' + self.topicId.title

确实有

  • 专题,
  • TopicLabels和
  • 它们之间的连接(TopicLabelConnection)。

可以为多个主题分配一个标签。

我想显示一个具有以下结构的有序列表:

  1. 标签1
    1. 专题1
    2. 专题2
    3. 专题3

  1. 标签2
    1. 专题4
    2. 专题5
    3. 专题6

其中主题1、2和分配给标签1,主题4、5和6-标记2。

为此,我创建了视图函数和HTML模板片段,如下所示。

视图函数

代码语言:javascript
复制
def home(request):      
    labels = TopicLabel.objects.filter(connection_label__isnull=False).distinct().order_by('order')

    return TemplateResponse(request, 'home.tpl.html', locals())

模板片段

代码语言:javascript
复制
<ol>
    {% for cur_label in labels %}
        <li>{{ cur_label.name }}</li>
        <ol>
        {% for cur_topic_label_connection in cur_label.getTopics %}
            <li>{{ cur_topic_label_connection.topicId.title }}</li>
        {% endfor %}
        </ol>
    {% endfor %}    
</ol>

结果是:只显示标签,而不显示主题。

我应该如何更改代码以使标签和主题都显示在实用列表中?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-09-26 19:38:43

您应该使用适当的ManyToMany字段:

代码语言:javascript
复制
class TopicLabel(models.Model):
    ...
    topics = models.ManyToManyField(Topic, through=TopicLabelConnection)

现在可以删除getTopics方法了,在模板中您可以这样做:

代码语言:javascript
复制
{% for topic in cur_label.topics.all %}
    <li>{{ topic.title }}</li>
{% endfor %}

请注意,order_by调用在getTopics中是没有意义的,因为只有order字段的模型是TopicLabel,但是您正在尝试获取没有order字段的主题。

票数 1
EN

Stack Overflow用户

发布于 2013-09-26 19:07:36

你没有正确地过滤。

问题在getTopics方法中

试一试:

代码语言:javascript
复制
return TopicLabelConnection.objects.filter(labelId__id=self.id).order_by('order')

注意,labelId是一个TopicLabel,而不是它的id

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19036506

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档