查询foreignkey嵌套for循环django

时间:2017-05-03 21:15:13

标签: python django for-loop nested

我正在尝试返回商家的类别列表,对于每个类别,我想列出与该类别相关的所有商品。

我退回了所有项目,而不是按类别,但我已经决定要按类别排序。这是我尝试过的(以及其他尝试)我只是在将项目放入类别时遇到问题。这是我最近的尝试

在我的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)

在我的views.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. 这是正确的做法吗?或者我应该先尝试使用
  2. 获取类别

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

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

    1. 当我在模板中引用数据但我的模型有2个单词(ItemCategory)时 - 例如当我向后移动外键或在select_related('')中使用模型时 - 我会使用item_category吗?使用没有下划线的itemcategory?
    2. 更新:我在评论中作了解释并在下面回答。

2 个答案:

答案 0 :(得分:0)

  1. items = Item.objects.filter(business_id = business_id)错了。 你应该说:

    items = Item.objects.filter(business__id = business_id)#Notice双下划线。

  2. 你也可能更喜欢这项业务并简单地说:

    business.item_set.all() #This would retrieve all Item for the business.
    
    1. select_related()期望将字段名称作为参数。因此,请使用Item模型上存在的字段名称。像:

      select_related('category')

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

答案 1 :(得分:0)

为了按类别列出项目,我使用了@ 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()并输入你所订购的字段的参数 - 在我的例子中,类别。如果不包含此项,则只会按时间顺序列出项目,并重复您的字段实例。