Как получить все варианты одного продукта в одном объекте JSON для каждого продукта - Django Rest Framework

Как я это делаю, например, в функции getProductList в моем views.py, и она дает мне каждый продукт с его вариантами в разных объектах, например, один и тот же продукт с разными размерами помещается в другой объект, даже если продукт один и тот же, как например:

JSON:

[
    {
        "prod_id": {
            "id": 3,
            "prod_name": "CRUISER-149S-DEERCALF",
            "category": 2
        },
        "size_id": {
            "id": 2,
            "name": "26"
        },
        "color_id": 2,
        "image_id": {
            "id": 10,
            "prod_image": "/media/products/IMG_7617_ftgqoa.jpg"
        }
    },
    {
        "prod_id": {
            "id": 3,
            "prod_name": "CRUISER-149S-DEERCALF",
            "category": 2
        },
        "size_id": {
            "id": 3,
            "name": "27"
        },
        "color_id": 2,
        "image_id": {
            "id": 10,
            "prod_image": "/media/products/IMG_7617_ftgqoa.jpg"
        }
    }
]

Есть ли способ сделать его более оптимизированным? Например, иметь только один объект продукта, который имеет всю информацию об одном продукте, например, размер может быть свойством со значениями всех размеров в нем, как размер: [26, 27] вместо другого объекта, если размер отличается.

models.py

class Products(models.Model):
    prod_name = models.CharField(max_length=200) 
    category = models.ForeignKey(Categories,null=True, on_delete=models.SET_NULL)

    def __str__(self):
        return '%s'%(self.prod_name)

class Variants(models.Model):
    prod_id = models.ForeignKey(Products, on_delete=models.CASCADE)
    size_id = models.ForeignKey(Size, null=True, on_delete=models.SET_NULL, related_name='variants')
    color_id = models.ForeignKey(Color, null=True, on_delete=models.SET_NULL, default='')
    image_id = models.ForeignKey(Image,null=True, on_delete=models.SET_NULL, default='')

    def __str__(self):
        return '%s %s %s %s %s %s %s'%(self.id , self.prod_id, self.size_id, self.image_id, self.color_id, self.quantity, self.price)

serializer.py

class ProductsSerializer(serializers.ModelSerializer):
    # variants = serializers.StringRelatedField(many=True)

    class Meta:
        model = Products
        fields =  "__all__"

class SizeSerializer(serializers.ModelSerializer):
     class Meta:
        model = Size
        fields =  "__all__"

class VariantsSerializer(serializers.ModelSerializer): 
     prod_id = ProductsSerializer(many=False, read_only=True)
     image_id = ImageSerializer(many=False, read_only=True)
     size_id = SizeSerializer(many=False, read_only=True)

    class Meta:
        model = Variants
        fields = ['prod_id', 'size_id', 'quantity', 'price', 'color_id', 'image_id']

views.py

def getProductList(request):
    print(request.GET.get('category'))
    if(request.method == 'GET'):
        if request.GET.get('category') == 'all' :
            productList = Variants.objects.all().select_related()
            serializer = VariantsSerializer(productList, many=True)
            return JsonResponse(serializer.data, safe=False)
    return JsonResponse({'details': 'Error in getting product list'})
Вернуться на верх