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)
Вернуться на верх