Django отображение атрибута промежуточной сущности через родительскую сущность

Я пытаюсь сослаться на атрибут из промежуточной сущности Material_Requisition_Items через поле ManytoManyField Material_Requisition.reqItems и отобразить его в HTML; однако вместо этого он ссылается на родительскую сущность Item.

Есть ли способ ссылаться на атрибуты промежуточной сущности через родительскую в Django HTML?

models.py

[Посредническая организация]

class Material_Requisition_Items(models.Model):
    reqID = models.ForeignKey("Material_Requisition", on_delete=models.CASCADE)
    itemID = models.ForeignKey('item.Item', on_delete=models.CASCADE)
    ...
    itemQuantity = models.PositiveIntegerField(default=0, null=True)

[Родительская организация]

class Material_Requisition(models.Model):
    ...
    reqItems = models.ManyToManyField(
            Item,
            through="Material_Requisition_Items",
            through_fields=('reqID', 'itemID'),
            related_name="mat_req_items"
            )

requisition_detail.html

{% for item in object.reqItems.all %}
<td>{{ item.itemID.itemName }}</td>
<td>{{ item.itemQuantity}}</td>
{% endfor %}

views.py

class RequisitionDetailView(LoginRequiredMixin, generic.DetailView):
    model = Material_Requisition
    template_name = "requisition/requisition_detail.html"
    context_object_name = "requisition"

Да, вы можете получить доступ к отношению с помощью менеджера material_requisition_items_set вместо этого:

{% for item in object.material_requisition_items_set.all %}
    <td>{{ item.itemID.itemName }}</td>
    <td>{{ item.itemQuantity }}</td>
{% endfor %}

Вы можете повысить эффективность, предварительно получая и немедленно выбирая связанные itemID с Prefetch объекты [Django-doc]:

from django.db.models import Prefetch

class RequisitionDetailView(LoginRequiredMixin, generic.DetailView):
    model = Material_Requisition
    queryset = Material_Requisition.objects.prefetch_related(
        Prefetch('material_requisition_items_set', Material_Requisition_Items.objects.select_related('itemID'))
    )
    template_name = 'requisition/requisition_detail.html'
    context_object_name = 'requisition'

Примечание: обычно модели Django, как и всем классам в Python, дается имя в PascalCase, а не snake_case, поэтому оно должно быть: MaterialRequisitionItems вместо Material_Requisition_Items.


Примечание: Обычно не добавляют суффикс ID к полю ForeignKey, так как Django автоматически добавит поле-"близнец" с суффиксом _id. Поэтому он должен быть item, вместо itemID.

.
Вернуться на верх