Как вставить данные о продукте во все связанные таблицы в django с помощью сериализаторов

#python #django

#python #django

Вопрос:

Я использую Django REST Framework, я застрял во вставке связанных данных о продукте в несколько таблиц. Пожалуйста, ознакомьтесь со сценарием ниже:

В AddProductSerializer , я хочу снова вставить цикл variations for в часть else во вложенном сериализаторе django, чтобы я мог сохранить все данные, связанные с таблицей продуктов.

Данные Json

 {
"category": 15,
"images": [
    {"image_url": "https://images/1607679352290_0f32f124a14b3e20db88e50da69ad686.jpg", "main_image": true},
    {"image_url": "https://images/1607679352290_0f32f124a14b3e20db88e50da69ad686.jpg", "main_image": false}
],
"keywords": "related keywords",
"long_description": "<p>l</p>",
"mrp_price": "120",
"selling_price": "908",
"short_description": "<p>k</p>",
"sku": "Sam-009",
"stock": "7",
"title": "Samsung",
"have_variations": true,
"variant": "Size-Color",
"slug": "samsung-phone",
"variations": [
{
    "image_url": "https://images/607679417554_0f32f124a14b3e20db88e50da69ad686.jpg",
    "mrp_price": 68,
    "selling_price": 86786,
    "sku": "iuy",
    "stock": 68768,
    "title": "hkj",
    "color": {
        "name": "red"
    },
    "size": {
        "name": 9
    }
},
{
    "image_url": "https://images/607679434082_0392bab5c6a3ec64552ea57aa69852a5.jpg",
    "mrp_price": 67,
    "selling_price": 6876,
    "sku": "hkjh",
    "stock": 868,
    "title": "yiui",
    "color": {
        "name": "blue"
    },
    "size": {
        "name": 9
    }
}
]
}
 

Serializer.py

 # List images
class ImageSerializer(serializers.ModelSerializer):
    class Meta:
        model = Image
        fields = ('image_url', 'main_image',)


# List variations
class VariationSerializer(serializers.ModelSerializer):
    class Meta:
        model = Variation
        fields = ('title', 'stock', 'mrp_price', 'selling_price',)


# List sizes
class SizeSerializer(serializers.ModelSerializer):
    class Meta:
        model = Size
        fields = ('name',)


# List sizes
class ColorSerializer(serializers.ModelSerializer):
    class Meta:
        model = Color
        fields = ('name',)


# Add products
class AddProductSerializer(serializers.ModelSerializer):
    images = ImageSerializer(many=True)
    size = SizeSerializer(many=True, required=False)
    color = ColorSerializer(many=True, required=False)
    variations = VariationSerializer(many=True)

    class Meta:
        model = Product
        fields = '__all__'

    def create(self, validated_data):
        images = validated_data.pop('images')
        variations = validated_data.pop('variations')
        product = Product.objects.create(**validated_data)
        for image in images:
            Image.objects.create(product=product, **image)

        if validated_data['have_variations']:
            if validated_data['variant'] == 'Size':
                for variation in variations:
                    size = Size.objects.create(name=variation['size'])
                    Variation.objects.create(product=product, size=size, **variation)
            elif validated_data['variant'] == 'Color':
                for variation in variations:
                    color = Color.objects.create(name=variation['color'])
                    Variation.objects.create(product=product, color=color, **variation)
            else:
                for variation in variations:
                    size = variation.pop('size')
                    size_id = Size.objects.create(**size)
                    color = variation.pop('color')
                    color_id = Color.objects.create(**color)
                    Variation.objects.create(product=product, size=size_id, color=color_id, **variation)
        return product
 

Нажмите здесь, чтобы увидеть снимок ошибки

Комментарии:

1. Но в чем проблема, с которой вы столкнулись? Вы получаете какую-либо ошибку?

2. Ошибка ключа для ‘size’, я не могу указать размер в цикле variations и то же самое для цвета

3. Пожалуйста, поделитесь трассировкой ошибок.

4. Я добавил ссылку с фотографией ошибки выше.