Когда queryset возвращает более одного, как выбрать конкретный объект?

Я пытаюсь получить значение атрибута из определенного объекта с помощью queryset ниже:

x_img = ProductImages.objects.get(product_id=x_id), при этом возвращается more than one, если я использую filter, x_img = ProductImages.objects.filter(product_id=x_id), то нужный мне атрибут (image_file_w200_png) недоступен.

Контекст:

Я хочу создать динамические значения в моем head, для этого мой выбор custom context_processors, итак:

head_meta_processors.py

import os
from .models import Product, ProductImages
def meta(request):
    path_id = os.path.basename(os.path.normpath(request.path))
    x_id = path_id
    x_obj = Product.objects.get(pk=x_id)
    #...
    # here is the problem
    x_img = ProductImages.objects.get(product_id=x_id)
    x_meta_itemprop_image = x_img.image_file_w200_png.url
    
    return {
        #...
        'meta_itemprop_image': x_meta_itemprop_image,
        #...}

models.py

class Product(models.Model):
    #... some fields

class ProductImages(models.Model):
    #... Fk to model above
    product = models.ForeignKey(Product, on_delete=models.CASCADE)
    product_id = ...
    image_type = models.CharField(max_length=33,default='normal')    
    image_file_w200_png = models.ImageField(
        upload_to=upload_to_image_file_w200_png,
        null=True,
        blank=True,
        default='default_image_thumbnail.png'
    )

Каждая Product модель, может иметь много ProductImages связанных product_id полей.

Итак, мои queryset, ProductImages.objects.get(product_id=x_id) возвращают 3 объекта, связанных с этим product_id, как можно получить доступ к каждому из них и как выбрать конкретный, например, индекс, например:x_img[0]?

Используйте .filter(…), а затем подстрочный индекс:

x_img = ProductImages.objects.filter(product_id=x_id)[0]

Вы не можете выполнить subscript на .get(…), поскольку это вызывает ошибку, когда возвращается несколько элементов, следовательно, нет результата для subscript, но .filter(…) возвращает QuerySet, который вы можете выполнить subscript.

The above will raise an error in case there is no record to return. You can use .first() [Django-doc] to return None instead:

x_img = ProductImages.objects.filter(product_id=x_id).first()
Вернуться на верх