Django:如何正确显示相关模型中的对象列表?

时间:2018-02-23 10:17:44

标签: python django python-2.7 django-1.11

我有2个型号:产品和部分。

models.py:

class Section(models.Model):
  name = models.CharField(max_length=255, blank=False, null=True,)

class Product(models.Model):
  name = models.CharField(max_length=255, blank=False, null=True,)
  section = models.ForeignKey(Section,on_delete=models.CASCADE)

我正在尝试在模板中显示包含产品的部分列表。我用这个任务regroup标签,但有一些问题。

1)没有任何产品的部分不可见。如何显示没有产品的部分?

2)在数据库中,某些产品在section字段中具有NULL值。如何将这些产品分组到一个部分?

我将不胜感激任何建议或榜样! =)

views.py:

context['products'] = Product.objects.select_related('section').order_by('section')

模板:

{% regroup products by section as products_by_section %}

{% for section in products_by_section %}
    {{ section.grouper}}
    {% for product in section.list %}
        {{ product }}
    {% endfor %}
{% endfor %}

2 个答案:

答案 0 :(得分:2)

我建议创建一个默认部分,并将其添加到具有null部分值的所有products。然后,您可以在Section模型上查询以获取所有部分及其相关产品。这将简化设计,并从代码中删除所有空检查。

查询的格式为:

  

sections = Section.objects.all()。prefetch_related(' product_set')

现在您已将sections及其产品分组。您可以使用密钥section_id创建字典,并将值作为产品列表

section_products_dict = {}
for section in sections:
    section_products_dict[section.id] = section.product_set.all()

然后你可以将这个字典传递给模板。获得sections列表后,您可以通过多种不同方式查询产品。我已经创建了字典,但您可以根据需要使用它(比如直接在模板中使用)。

如果无法添加默认部分,请对产品和部分执行两次单独的查询,并将其与section_id组合为键和值作为列表或products

答案 1 :(得分:1)

发送包含上下文数据而不是sections

的产品的products
context['sections'] = Section.objects.exclude(product_set__isnull=True)

并在sections

上的模板循环中
{% for section in sections %}
    {{ section.name }}
    {% for product in section.product_set.all %}
        {{ product.name }}
    {% endfor %}
{% endfor %}
  

了解有关在related objects

上制作django查询的详情