Когда 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()