【问题标题】:querying foreignkey nested for loop django查询嵌套for循环django的外键
【发布时间】:2017-05-03 21:15:13
【问题描述】:

我正在尝试返回一个企业的类别列表,对于每个类别,我想列出与该类别相关的所有项目。

我退回了我所有的物品,而不是按类别,但我决定我希望它们按类别排序。这是我尝试过的(以及其他尝试)我只是无法将项目归入那里。这是我最近的尝试

在我的 models.py 中有

Business(models.Model):
    name = models.CharField(max_length=100)
    address = models.CharField(max_length=100)
    logo = models.CharField(max_length=300)

ItemCategory(models.Model):
    name = models.CharField(max_length=50)

Item(models.Model):
    name = models.CharField(max_length=100)
    business = models.ForeignKey(Business)
    category = models.ForeignKey(ItemCategory)
    short_description = models.CharField(max_length=250)

在我看来.py

def business_profile(request, business_id):
    items = Item.objects.filter(business_id = business_id).select_related('itemcategory')

return render(request, 'business_profile.html', {"items": items})

在我的模板中我正在尝试

{% for itemcategory in items.itemcategory_set.all %}
    {{ itemcategory.name }}
        {% for item in itemcategory %}

            {{ item.name }} <br>
            {{ item.short_description }}

        {% endfor %}

{% endfor %}

根据我对其他问题的研究和阅读文档,我觉得这是正确的。但是根据我的结果,我无法在模板中得到正确的输出。

  1. 这是正确的做法吗?或者我应该先尝试获取类别

categories = ItemCategory.objects.filter(business = business_id)

然后可能添加一个 select_related('item') 来处理该类别的所有项目?

  1. 当我在模板中引用数据但我的模型有 2 个单词 (ItemCategory) - 例如,当我向后移动外键或在 select_related('') 中使用模型时 - 我会使用 item_category 还是简单使用不带下划线的 itemcategory?

更新:我在下面的评论中回答了解释。

【问题讨论】:

    标签: python django for-loop nested


    【解决方案1】:

    为了按类别列出项目,我使用了@yusuf.oguntola 的想法,最初通过.get() 获得了业务,然后我创建了一个查询集来获取所有项目。我在 views.py 中的功能包括

    business = Business.objects.get(id = business_id)
    items = business.item_set.all().order_by('category')
    

    注意:business_id 是以 url 模式传递的

    但是,关键变化是在我的模板中。我在 django 文档 here

    中发现了这个很棒的内置模板功能

    我是这样在模板中实现的...

    {% regroup items by category as category_list %}
    
      <ul>
      {% for category in category_list %}
         <li>{{ category.grouper }}
         <ul>
             {% for item in category.list %}
                 <li>{{ item.name }}<br> {{ item.short_description }}</li>
             {% endfor %}
         </ul>
         </li>
      {% endfor %}
      </ul>
    

    其中一个最重要的部分是您必须拥有 order_by() 并放置您订购的字段的参数 - 在我的情况下,类别。如果这不包括在内,它只会按时间顺序排列列出的项目并重复您的字段实例。

    【讨论】:

      【解决方案2】:
      1. items = Item.objects.filter(business_id = business_id) 是错误的。 你应该说:

        items = Item.objects.filter(business__id = business_id) #注意双下划线

      您也可能宁愿获得业务并简单地说:

      business.item_set.all() #This would retrieve all Item for the business.
      
      1. select_related() 需要一个字段名作为参数。因此,请使用 Item 模型中存在的字段名称。喜欢:

        select_related('category')

      2. 饭在哪里?也许你可以从那里继续。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-09-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多