DJANGO : Как вывести значение из класса в классе prefetch_related, который вызывает другой класс в качестве внешнего ключа?

Я очень новичок в Django и пробовал различные ответы на вопросы на этом форуме. Но я не смог отобразить ТИТУЛ продукта. Я хочу отобразить TITLE для моего продукта из DB.

Из models.py :

class Product(models.Model):
    title = models.CharField(max_length=255)
    slug = models.SlugField()
    description = models.TextField()
    unit_price = models.DecimalField(max_digits=6, decimal_places=2)
    inventory = models.IntegerField()
    last_update = models.DateTimeField(auto_now=True)
    collection = models.ForeignKey(Collection, on_delete=models.PROTECT)
    promotions = models.ManyToManyField(Promotion)


class Order(models.Model):
    PAYMENT_STATUS_PENDING = 'P'
    PAYMENT_STATUS_COMPLETE = 'C'
    PAYMENT_STATUS_FAILED = 'F'
    PAYMENT_STATUS_CHOICES = [
        (PAYMENT_STATUS_PENDING, 'Pending'),
        (PAYMENT_STATUS_COMPLETE, 'Complete'),
        (PAYMENT_STATUS_FAILED, 'Failed')
    ]

    placed_at = models.DateTimeField(auto_now_add=True)
    payment_status = models.CharField(
        max_length=1, choices=PAYMENT_STATUS_CHOICES, default=PAYMENT_STATUS_PENDING)
    customer = models.ForeignKey(Customer, on_delete=models.PROTECT)

class OrderItem(models.Model):
    order = models.ForeignKey(Order, on_delete=models.PROTECT)
    product = models.ForeignKey(Product, on_delete=models.PROTECT)
    quantity = models.PositiveSmallIntegerField()
    unit_price = models.DecimalField(max_digits=6, decimal_places=2)

Из файла views.py :

order = Order.objects.select_related('customer').prefetch_related('orderitem_set__product').order_by('-placed_at')[:5]

Из файла hello.html :

{% for prod in order %}
      <li>Order ID : {{ prod.id }} -- Customer {{ prod.customer.first_name }} -- Product {{ prod.orderitem_set.product.title }}</li>

У меня есть 2 вопроса:

  1. In hello.html : How do I display the Product Title?
  2. In the views.py : How do I load and display the promotions from the product class in same call?

Ожидаемый выход :

Order ID : 408 -- Customer Olin -- Product -- Cheese -- Promotion : xyz
Order ID : 513 -- Customer Merna -- Product -- Milk -- Promotion : xyz
Order ID : 711 -- Customer Rubi -- Product -- Biscuits -- Promotion : xyz
Order ID : 2 -- Customer Nicko -- Product -- Curd -- Promotion : xyz
Order ID : 248 -- Customer Shandeigh -- Product -- Butter -- Promotion : xyz

Причина, по которой это не сработало, заключается в том, что у вас было более одного элемента orderitem для вашего заказа. Поэтому вам нужно добавить all, а затем index.

Измените это

<li>Order ID : {{ prod.id }} -- Customer {{ prod.customer.first_name }} -- Product {{ prod.orderitem_set.product.title }}</li>

К этому

<li>Order ID : {{ prod.id }} -- Customer {{ prod.customer.first_name }} -- Product {{ prod.orderitem_set.all.0.product.title }}</li>

Возможно, вместо этого вы хотите выполнить цикл по элементам заказа?

views.py

orderObjs = Order.objects.select_related('customer').prefetch_related('orderitem_set__product').order_by('-placed_at')[:5]

orderitems = []
for orderObj in orderObjs:
    orderitems.append(OrderItem.objects.get(order=orderObj))

context = {
    "orderitems": orderitems
}

В вашем html файле

{% for orderitem in orderitems %}
    <li>Order ID : {{ orderitem.order.id }} -- Customer {{ orderitem.order.customer.first_name }} -- Product {{ orderitem.product.title }}</li>
{% endfor %}
Вернуться на верх