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