Django (REST Framework) - Как добавить поля в итерацию кверисета
Мне нужен совет по составлению запроса в Django (DRF).
Я пытаюсь сделать кверисет для продуктов, где каждый продукт получает поле "images" со всеми изображениями для этого продукта (соединено с использованием модели ProductImage), но я не могу понять, как добавить это поле.
Ниже представлен мой набор ProductViewSet
class ProductViewSet(viewsets.ModelViewSet):
serializer_class = ProductSerializer
queryset = Product.objects.all()
def get_queryset(self):
queryset = Product.objects.all()
product_list = []
# iterate over all products
for product in queryset:
# find Image ids for product
image_ids = list(ProductImage.objects.filter(product=product.id).values_list('image', flat=True))
images = []
# iterate over images and add to images list
for image_id in image_ids:
image = list(File.objects.filter(id=image_id).all())
images.append(image)
# add images field to product
# product['images'] = images # "TypeError: 'Product' object does not support item assignment"
product.images = images # Doesn't do anything.
# add product to product list
product_list.append(product)
return product_list
Я пытался сделать следующее, чтобы добавить поле "images":
product['images'] = images
что приводит к ошибке "TypeError: 'Product' object does not support item assignment"
product.images = images
который ничего не делает...
Может ли кто-нибудь направить меня в правильном направлении? Любые советы о том, как лучше составить этот запрос, также приветствуются!
Трудно дать точный ответ, не видя других моделей, но если вы напишете более надежный запрос и используете annotate, аннотированные поля будут доступны и в фильтр-сетах, и в сериализаторах.
Есть ли в вашей модели 'Product' существующее поле 'images' с правильным типом данных?
Если нет, то вы не сможете обновить его списком FileObjects.
Лучшим решением может быть модельное отношение "многие-к-одному" между 'ProductImage' и 'Product'.
Тогда Django сможет лучше автоматически возвращать ваши изображения через ORM, а не сложными запросами на заказ. https://docs.djangoproject.com/en/4.0/topics/db/examples/many_to_one/
попробуйте использовать дикту, product_list = {} product_list[product] = images
удалить
product.images = images # Doesn't do anything.
# add product to product list
product_list.append(product)