Python Django:如何正确显示相关模型中的对象列表?
我有两种型号:产品和部分 型号。py:Python Django:如何正确显示相关模型中的对象列表?,python,django,python-2.7,django-1.11,Python,Django,Python 2.7,Django 1.11,我有两种型号:产品和部分 型号。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
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)
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 %}
我正试图在模板中显示包含其产品的部分列表。我为此任务使用了regroup
标记,但存在一些问题
1) 没有任何产品的部分将不可见。如何显示没有产品的部分
2) 在数据库中,某些产品在节字段中具有空值。如何将这些产品分为一个部分
我将非常感谢任何建议或示例!=)
视图。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)
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 %}
模板:
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)
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 %}
发送在上下文数据中包含产品的
部分,而不是产品
context['sections'] = Section.objects.exclude(product_set__isnull=True)
在部分的模板循环中
{% for section in sections %}
{{ section.name }}
{% for product in section.product_set.all %}
{{ product.name }}
{% endfor %}
{% endfor %}
阅读更多有关在上进行django查询的信息
发送在上下文数据中包含产品的部分,而不是产品
context['sections'] = Section.objects.exclude(product_set__isnull=True)
在部分的模板循环中
{% for section in sections %}
{{ section.name }}
{% for product in section.product_set.all %}
{{ product.name }}
{% endfor %}
{% endfor %}
阅读更多有关在上进行django查询的信息
我建议创建一个默认节,并将其添加到所有具有空节值的产品中。然后您可以查询Section
model以获得所有的Section及其相关产品。这将简化设计,并从代码中删除所有空检查
查询将采用以下格式:
sections=Section.objects.all().prefetch_相关('product_set'))
现在您已经有了部分
以及它们的产品。您可以创建一个字典,其中键为section\u id
,值为产品列表
section_products_dict = {}
for section in sections:
section_products_dict[section.id] = section.product_set.all()
然后您可以将此词典传递给模板。一旦您有了部分
列表,您就可以以多种不同的方式查询产品。我已经创建了字典,但您可以根据需要使用它(就像直接在模板中使用一样)
如果无法添加默认节,则对产品和节执行两个单独的查询,并将它们与section\u id
作为键和值作为列表或products
组合,我建议创建一个默认节,并将其添加到所有具有空节值的products
中。然后您可以查询Section
model以获得所有的Section及其相关产品。这将简化设计,并从代码中删除所有空检查
查询将采用以下格式:
sections=Section.objects.all().prefetch_相关('product_set'))
现在您已经有了部分
以及它们的产品。您可以创建一个字典,其中键为section\u id
,值为产品列表
section_products_dict = {}
for section in sections:
section_products_dict[section.id] = section.product_set.all()
然后您可以将此词典传递给模板。一旦您有了部分
列表,您就可以以多种不同的方式查询产品。我已经创建了字典,但您可以根据需要使用它(就像直接在模板中使用一样)
如果无法添加默认部分,则对产品和部分执行两个单独的查询,并将它们与部分_id
作为键和值作为列表或产品
>1)没有任何产品的部分合并。如何显示没有产品的部分?如果没有链接到某个节的产品实例,则它们是不相关的,是吗?你想如何选择“相关的无关对象”?@py_dude你好!你完全正确!我想我需要重新组织我的代码。我的主要目标是展示与这些部分相关的所有部分和产品。如果没有产品的部分显示消息,如:无产品。我希望你能理解我。你有什么想法吗?>1)没有任何产品的部分看不见。如何显示没有产品的部分?如果没有链接到某个节的产品实例,则它们是不相关的,是吗?你想如何选择“相关的无关对象”?@py_dude你好!你完全正确!我想我需要重新组织我的代码。我的主要目标是展示与这些部分相关的所有部分和产品。如果没有产品的部分显示消息,如:无产品。我希望你能理解我。您对如何制作有什么想法吗?请您解释一下产品集
在这里的意思好吗Section
模型没有product字段,所以我有点困惑。product\u set是一个反向查找,您在product表中提到了Section外键。请查看此答案,以便更好地理解\u set
事实上,在我的例子中,Section
模型的名称为FinSection
。所以我试着像finsection\u set
那样写,但没有成功。提出错误。这是否意味着我需要在ForeignKey
(部门模型的部门字段)中设置相关的\u name
属性?您的产品型号名称是什么,请在它之后使用\u set
您能解释一下产品\u set
的含义吗Section
模型没有product字段,所以我有点困惑。product\u set是一个反向查找,您在product表中提到了Section外键。请查看此答案,以便更好地理解\u set
事实上,在我的例子中,Section
模型的名称为FinSection
。所以我试着像finsection\u set
那样写,但没有成功。提出错误。这是否意味着我需要在ForeignKey
(部门模型的部门字段)中设置相关的\u name
属性?您的产品型号名称是什么,请在之后使用\u set
谢谢您的建议。我正在尝试使用你的解决方案,它看起来很好,但我没有什么问题。让我试着解释一下。我对节进行如下排序:section.objects.all().prefetch\u related('prodcut\u set')。order\u by('order\u by')
。它将返回一个带有下一个ID的部分:3,1,6,5
。这是正确的。但是在部分中,我有{1:Queryset,3:Queryset,5:Queryset,6:Queryset,}
为什么要对dict排序?字典不保持顺序。使用