Запросить наборы запросов в Django? Попытка вернуть шаг, а затем подшаги под ним

Я думаю, что это на самом деле очень интуитивно, но я не могу понять это.

Итак, у меня есть модель под названием SWS_Document. Затем у меня есть SWS_Document_Step, у которого есть внешний ключ для SWS_Document. После этого у меня есть 3-я модель SWES_Step, которая имеет внешний ключ для SWS_Document_Step. По сути, SWES_Document_Step является подэтапом SWS_Document_Step.

Пример. Это будет «Смешайте масло с рецептом» будет SWS_Document_Step. В то время как SWES_Document_Step__id=1 будет «Поместите масло в миску, пригодную для использования в микроволновой печи». SWES_Document_Step__id=2 будет "Подготовить масло в микроволновой печи на 30 секунд".

Это подэтапы, чтобы «подмешать масло в рецепт».

class SWS_Document(models.Model):

    machines = models.ManyToManyField(Machine, related_name='SWS_documents')
    document_description = models.CharField(max_length=150, default = "")
    pub_date = models.DateTimeField(auto_now=True)

class SWS_Document_Step(models.Model):

    STEP_TYPE_CHOICES = (
        ('People', 'People'),
        ('Quality', 'Quality'),
        ('Velocity', 'Velocity'),
        ('Cost', 'Cost'),
    )
    document_number = models.ForeignKey(SWS_Document, on_delete=models.CASCADE)
    sws_sequence_number = models.PositiveIntegerField(editable=True, null=True)

class SWES_Step(models.Model):

    STEP_TYPE_CHOICES = (
        ('People', 'People'),
        ('Quality', 'Quality'),
        ('Velocity', 'Velocity'),
        ('Cost', 'Cost'),
    )
    sws_document_id = models.ForeignKey(SWS_Document_Step, on_delete=models.CASCADE, null=True)
    swes_description = models.CharField(max_length=500)
    swes_step_type = models.CharField(max_length=8, choices=STEP_TYPE_CHOICES, blank=True)
    pub_date = models.DateTimeField(auto_now=True)

Так что, на мой взгляд, я предпринял swsallsteps.

def DocumentView(request, document_id):
    # final goal should be to pass a list full of lists...
    # e.g. [
    #[name1, [hazard1, hazard2], [assessment1, assessment2]],
    #[name2, [hazard3, hazard4], [assessment3, assessment4]],
    #]
    steps = []
    swsallsteps = SWS_Document_Step.objects.filter(document_number=document_id)
    swesallsteps = SWES_Step.objects.filter(sws_document_id=document_id)
    return render(request, 'StandardWorkDocuments/document.html', {
        'swsallsteps': swsallsteps,
        'swesallsteps': swesallsteps,
    })

Затем в Document.html у меня есть несколько циклов for.

{% for step in swsallsteps %}
    <button class='collapsible'>{{ step.sws_sequence_number }} - {{ step.sws_work_element_description}} - <em><b>{{step.sws_step_type}}</b></em> - published - {{step.pub_date}}</button>
    <div class = "content">
        {% for swessteps in swesallsteps %}
            <p>{{swessteps.swes_description}}</p>
        {% endfor %}
    </div>
{% endfor %}

По сути, я считаю, что пытаюсь получить набор запросов в запросе. Таким образом, это будет [[Смешайте масло с рецептом, [Поместите масло в миску, пригодную для использования в микроволновой печи, разогрейте масло в течение 30 секунд]]

Это то, что я сейчас получаю

Это то, что я хотел бы получить, например, с несколькими глупыми точками, чтобы показать

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
3
0
73
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете (и должны) обращаться к вложенным элементам через родительский элемент. В документации Django есть несколько полезных Примеры для доступа к связанным объектам, и в этом вопрос вы можете найти более подробное изложение доступа к связанным объектам; например, свойство related_name может заменить синтаксис model_set и улучшить читаемость (если выбрано правильно).

Ваш второй цикл должен выглядеть так:

{% for swes_step in step.swes_step_set.all %}
    <p>{{swes_step.swes_description}}</p>
{% endfor %}

Теперь вы получаете доступ ко второму уровню шага не из отдельного набора запросов, а из родительского шага. Вы можете отказаться от второго набора запросов (swesallsteps).

Чтобы избежать множества запросов к базе данных, вы должны использовать prefetch_related, чтобы получить все данные за как можно меньшее количество шагов:

swsallsteps = (SWS_Document_Step.objects
    .filter(document_number=document_id)
    .prefetch_related('swes_step_set')
)

где вы взяли swes_step_set? Является ли часть «_set», добавленная в модель «swes_step», по сути, «Model» + «_set»? или я что-то упускаю?

Timothyjames67 10.04.2019 16:42

Хорошо замечено, что именно так вы получаете доступ к отношению x-to-many, которое определено в другой модели. Смотрите ссылку в обновленном ответе.

Endre Both 10.04.2019 16:45

Итак, «_set» — это часть объектно-ориентированного программирования того, что вы можете сделать с запросом? Что делать, если я пытаюсь получить соответствующую информацию о SWES_Step? Потому что у меня там тоже есть соответствующая информация.

Timothyjames67 10.04.2019 17:51

Другие вопросы по теме