Python, ошибка Django3: объект QuerySet не имеет атрибута pattern - PullRequest
0 голосов
/ 01 мая 2020

Я очень новичок в Python и Django. У меня проблема с запросом в моем приложении. Я хочу получить значение для шаблона в модели детали (выпуск M2M)

И у меня django ошибка:

' Объект QuerySet' не имеет атрибутов 'шаблонов '

Что такое ошибка и как ее исправить?

Спасибо за помощь

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 %}

1 Ответ

1 голос
/ 01 мая 2020

Вы не можете получить доступ к m2m в наборе запросов. allParts - это набор запросов всех частей, в то время как .patterns указывает на связанные с m2m объекты для каждого экземпляра, а не на весь набор запросов.

Чтобы получить все отношения 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.

Кроме того, вам нужно использовать для l oop в вашем шаблоне, так как patterns будет указывать на список шаблонов, а не только объект:

{% for part in parts %}
        <tr>
            ...
            <td>
            {% for pattern in part.pattern.all %}
                <span>{{ pattern.patternName }}</span>
            {% endfor %}
            </td>
            ...
        </tr>
{% endfor %}

Примечания:

  • Вы, вероятно, должны использовать parts вместо part для отношения m2m.

  • related_name используется для обратного поиска, что означает, что когда вы хотите получить доступ к деталям из Pattern модели.

  • Изменение related_name на "parts" делает больше смысла, поскольку он используется при обратном поиске для Pattern модели.

...