簡體   English   中英

如何使用一個請求 DRF 創建多個對象

[英]how to create multiple objects with one request DRF

我有以下型號

class Product(models.Model):
    name = models.CharField(null=True, blank=True, max_length=500)
    category = models.CharField(null=True, blank=True, max_length=120)


class SpecificationName(models.Model):
    product = models.ForeignKey(Product, on_delete=models.CASCADE, null=True, related_name='specifications')
    name = models.CharField(max_length=125)

class Attribute(models.Model):
    spec_name = models.ForeignKey(SpecificationName, on_delete=models.CASCADE, null=True, related_name='attributes')
    index = models.CharField(max_length=200, blank=True, null=True)
    value = models.CharField(max_length=250, blank=True, null=True)

在 Django admin 中保存對象后,我有一個例子

{
    "name": "Apple Smart Watch",
    "category": "IT",
    "specifications": [
        {
            "name": "Test Data",
            "attributes": [
                {
                    "index": "test",
                    "value": "test2"
                },
                {
                    "index": "test7",
                    "value": "test8"
                },
                {
                    "index": "test9",
                    "value": "test10"
                }
            ]
        },
        {
            "name": "Test Data Continued",
            "attributes": [
                {
                    "index": "bla",
                    "value": "bla1"
                },
                {
                    "index": "bla 2",
                    "value": "bla 4"
                },
                {
                    "index": "test9",
                    "value": "test10"
                }
            ]
        },
        {
            "name": "Test Spec",
            "attributes": []
        }
    ]
}

我需要用一個請求保存這種對象,但我沒有做到這一點

我的序列化程序看起來像這樣

class ProductSerializer(serializers.ModelSerializer):
    specifications = SpecNameSerializer(many=True)
    # attributes = AttributeSerializer(many=True, required=False)

class Meta:
    model = Product
    fields = ['name', 'category', 'brand', 'price', 'specifications']

def create(self, validated_data):
    specs = validated_data.pop('specifications')
    instance = Product.objects.create(**validated_data)

    for spec in specs:
        SpecificationName.objects.create(product=instance, **spec)
        print(spec)

    return instance

使用此代碼,我得到以下結果但不符合預期

{
    "name": "Appel watch series",
    "specifications": [
        {
            "name": "Test Data",
            "attributes": []
        },
        {
            "name": "Test Data comn",
            "attributes": []
        },
        {
            "name": "Test Spec",
            "attributes": []
        }
    ]
}

它不能寫入屬性

我搜索了很多答案,但我沒有找到或應用其中的一些,這對我也沒有幫助。 我在視圖中只使用ListCreateView 請問有誰可以幫忙解決這個問題。 提前致謝!

解決了

我在這里使用ModelSerializer而不是我使用了Serializer並在我的答案中添加了一些更改並且它起作用了

class AttributeSerializer(serializers.Serializer):
    index = serializers.CharField(max_length=200)
    value = serializers.CharField(max_length=200)


class SpecNameSerializer(serializers.ModelSerializer):
    attributes = AttributeSerializer(many=True)

    class Meta:
        model = SpecificationName
        fields = '__all__'


class ProductSerializer(serializers.ModelSerializer):
    specifications = SpecNameSerializer(many=True)


    class Meta:
        model = Product
        fields = ['name', 'category', 'brand', 'price', 'specifications']


    def create(self, validated_data):
        specs = validated_data.pop('specifications')
        instance = Product.objects.create(**validated_data)

        for spec in specs:
            SpecificationName.objects.create(product=instance, **spec)
            attrs = spec.pop('attributes')
            for attr in attrs:
                Attribute.objects.create(spec_name=spec, **attr)

        return instance

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM