Python,Django3错误';QuerySet';对象没有属性';模式';
我对Python和Django非常陌生。我的应用程序中的请求有问题。 我想获得零件模型中模式的值(Relationship M2M) 我有一个django错误: “QuerySet”对象没有属性“patterns” 错误是什么?如何修复 谢谢你的帮助 Models.pyPython,Django3错误';QuerySet';对象没有属性';模式';,django,django-models,django-views,Django,Django Models,Django Views,我对Python和Django非常陌生。我的应用程序中的请求有问题。 我想获得零件模型中模式的值(Relationship M2M) 我有一个django错误: “QuerySet”对象没有属性“patterns” 错误是什么?如何修复 谢谢你的帮助 Models.py from django.db import models class Pattern(models.Model): patternName = models.CharField(max_length=64)
from django.db import models
class Pattern(models.Model):
patternName = models.CharField(max_length=64)
def __str__(self):
return self.patternName
class Part(models.Model):
unitsList = (
('szt', "szt"),
('m', "m"),
('komp', "komp")
)
partName = models.CharField(unique=False, max_length=128)
code = models.CharField(unique=True, max_length=15)
units = models.CharField(max_length=10, choices=unitsList, default='szt')
description = models.TextField()
pattern = models.ManyToManyField(Pattern, related_name='patterns')
def __str__(self):
return self.partName
views.py
from django.shortcuts import render,
from .models import Part, Pattern
def partList(request):
allParts = Part.objects.all()
allPatterns = allParts.patterns.objects.all()
return render(request, 'partList.html', {'parts': allParts, 'patterns': allPatterns})
partList.html
{% for part in parts %}
<tr>
<td>{{part.partName}}</td>
<td>{{part.code}}</td>
<td>{{part.units}}</td>
<td>{{part.description}}</td>
<td>{{part.producer}}</td>
<td>{{part.pattern}}
</td>
<td>
<!-- <a href="../editPart/{{part.id}}">EDYTUJ</a>
<a href="../deletePart/{{part.id}}">USUN</a> -->
<a href="{% url 'editPart' part.id %}">EDYTUJ</a>
<a href="{% url 'deletePart' part.id %}">USUN</a>
</td>
</tr>
{% endfor %}
{%用于零件中的零件%}
{{part.partName}
{{part.code}}
{{part.units}
{{part.description}}
{{part.producer}}
{{part.pattern}
{%endfor%}
您无法在queryset上访问m2mallParts
是所有部分的查询集,.patterns
指向每个实例的m2m相关对象,而不是整个查询集
为了获得queryset的所有m2m关系,您应该执行如下查询:
parts = Part.objects.all() # or filter
patterns = Pattern.objects.filter(patterns__in=parts)
您可以优化代码以减少对数据库的影响:
parts = Part.objects.all().prefetch_related("pattern")
这样,django将再执行一次查询,以获取所有相关模式,并将它们添加到python中的每个部分。然后,只需使用结果,而无需进行额外的数据库查询:
for part in parts:
patterns = part.patterns.all() # this won't hit the database for each part.
此外,您需要在模板中使用for循环,因为patterns
将指向一个模式列表,而不仅仅是一个对象:
{% for part in parts %}
<tr>
...
<td>
{% for pattern in part.pattern.all %}
<span>{{ pattern.patternName }}</span>
{% endfor %}
</td>
...
</tr>
{% endfor %}
{%用于零件中的零件%}
...
{%用于part.pattern.all%中的模式}
{{pattern.patternName}
{%endfor%}
...
{%endfor%}
旁注:
- 对于
关系,您可能应该使用m2m
而不是parts
part
用于反向查找,这意味着当您要从related_name
模型访问零件时模式
- 将
更改为related\u name
更有意义,因为它用于“parts”
模式的反向查找
pattern
而不带s
:pattern=models.ManyToManyField
,但视图中有allParts.patterns.objects.all()
和s
。更改其中一个,使其匹配。相关名称将您从一个图案带到其各个部分。因此,related\u name='parts'
会更好,然后您可以使用pattern.parts.all()
来获取模式的相关部分。在'patterns'
pattern=models.ManyToManyField(pattern,related\u name='patterns)的末尾缺少一个结束撇号
此外,您还命名了相关的\u名称模式,这些模式可能是Part,但我注意到,当我在views.py中只有allParts=Part.objects.all()并在html文件中添加第二个“for”时,一切正常。为什么?它会,但它会用每个部分的新查询命中数据库,但在视图中使用prefetch\u related
,将获取所有相关模式并将它们附加到每个部分,因此当您调用模式(part.pattern.all
)时,不会有新的数据库查询。其他部分则解释了不能在queryset上调用m2m。