I try get attribute value item from specific object with queryset
below:
x_img = ProductImages.objects.get(product_id=x_id)
, with that, return more than one
, if i use filter
, x_img = ProductImages.objects.filter(product_id=x_id)
, the attribute i need(image_file_w200_png
) is unvailable.
The context:
I want to create a dynamic values in my head
, to do that my choice is custom context_processors
, so:
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'
)
Each Product
model, can have many ProductImages
related by product_id
field.
So, my queryset
, ProductImages.objects.get(product_id=x_id)
, return 3 objects related with that product_id
, how can access each one and how choice a specifc, like a index, e.g.:x_img[0]
?
CodePudding user response:
Use .filter(…)
and then subscript:
x_img = ProductImages.objects.filter(product_id=x_id)[0]
You can not subscript on a .get(…)
since that raises an error when multiple items are returned, hence there is no result to subscript, but a .filter(…)
returns a QuerySet
that you can 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()