Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python,Django3错误';QuerySet';对象没有属性';模式';_Django_Django Models_Django Views - Fatal编程技术网

Python,Django3错误';QuerySet';对象没有属性';模式';

Python,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)

我对Python和Django非常陌生。我的应用程序中的请求有问题。 我想获得零件模型中模式的值(Relationship M2M)

我有一个django错误:

QuerySet”对象没有属性“patterns”

错误是什么?如何修复

谢谢你的帮助

Models.py

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上访问m2m
allParts
是所有部分的查询集,
.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。