查询嵌套循环django的外国钥匙



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

我不是返回所有项目,而不是按类别返回,但我决定我希望它们按类别进行排序。这就是我尝试的(除其他尝试外(,我只是在将这些物品放入那里很难。这是我的最新尝试

在我的型号中,我有

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_reced('item'(来处理类别的所有项目?

  1. 当我在模板中引用数据时,但是我的模型有2个单词(itemScategory( - 例如,当我向后方移动外键或在select_recelated(''(中使用模型时,我会使用item_category还是您只是简单地使用使用没有下划线的ItemCategory?

更新:我在以下评论中回答说明。

要按类别列出这些项目,我使用 @yusuf.oguntola的想法,最初与.get((获得业务,然后我创建了一个querySet来获取所有项目。我在Views.py中的功能包括

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

注意:business_id以URL模式传递

但是,关键更改在我的模板中。我发现此处的Django文档中的模板内置功能

我在模板中实现了它...

{% 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((并将您要订购的字段参数放置 - 在我的情况下,类别。如果不包括其中,它将仅按时间顺序排列列出的项目,并重复您的字段实例。

  1. items = Item.objects.filter(business_id = business_id)是错误的。您应该说:

    项目= item.Objects.filter(business__id = business_id(#notice double dusterscore。

您也可能宁愿获得业务,只是说:

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

    select_related('category')

  2. 吃饭在哪里?可能是您可以从那里开始。

最新更新