django ORM /模板组织

ddarikpa  于 2023-08-08  发布在  Go
关注(0)|答案(2)|浏览(74)

我有4个模型。比如说:

Modal BigBox:
   small_boxes = ManyToMany
   .....

Model SmallBox
   .....

Model Item
   .....

Model Big_box_small_box_items:
   big_box = fk(BigBox)
   small_box = fk(SmallBox)
   Item = fk(Item)
   .....

字符串
在我的模板中,我想去一个大盒子的模板,看到每个小盒子中的项目列表。我现在有一个工作页面,但它涉及到视图内的嵌套逻辑丢失和数据库命中的效率低下。
我的头是游泳有点作为一个爱好者,我会很感激任何指点。

wb1gzix0

wb1gzix01#

我最终在我的视图中创建了一个列表,并将数据库命中数从85减少到10。
当给你一个大盒子的时候。

big_box_small_boxes = small_box.objects.filter(big_box=big_box)
    big_box_small_boxes_dict = {}
    big_box_list = []
    for small_box in big_box_small_boxes:
        big_box_item_dict = {
            "small_box" : small_box.name,
            "big_box_items" : Big_box_small_box_items.objects.filter(big_box=big_box, small_box=small_box).prefetch_related('item')
        }
        big_box_list.append(big_box_small_boxes_dict)

字符串
然后在模板中...

{% for item in big_box_list %}
   {item.small_box}
   {% for big_box_item in item.big_box_items %}
      {% big_box_item.item.name %}
   {% endfor %}
{% endfor%}

biswetbf

biswetbf2#

在您的模板中,您应该能够执行以下操作:

{% for smallbox in bigbox.smallboxes.all %}
{{ smallbox.some_attribute }}<br>
{% endfor %}

字符串
类似的问题:https://stackoverflow.com/a/40569127/4872140
请注意,对于多对多,您在smallbox上不使用_set,因为您将用于正常的外键关系。

错误:(不要这样做)

{% for smallbox in bigbox.smallboxes_set.all %}
{{ smallbox.some_attribute }}<br>
{% endfor %}


在Django模板语言文档中有一些关于如何使用/为什么.all方法调用工作的讨论。更具体地说,关于ManyToMany处理。
编辑:阅读了你的评论后,我看到你有一个与我最初读到的略有不同的问题。我认为你可能需要在外部循环的内部添加另一个循环。由于帖子中模型中缺少细节,这里有点坚韧。我建议您将Big_box_small_box_items重命名为BigBoxSmallBoxItems,并将字段从Item重命名为item。检查编码风格并坚持使用它,以保存以后遇到麻烦(https://docs.djangoproject.com/en/dev/internals/contributing/writing-code/coding-style/#model-style)

{% for smallbox in bigbox.smallboxes.all %}
    {% for sbitem in smallbox.bigboxsmallboxitems_set.all %}
         {{ sbitem.item.your_item_attribute }}<br>
    {% endfor %}
{% endfor %}


我怀疑这是否会优化您的查询,并且您可能最终会保留所获得的内容。根据您已经在视图中看到的内容,您可能希望查看prefetch_related工具(https://docs.djangoproject.com/en/dev/ref/models/querysets/#prefetch-related)

相关问题