禁止直接分配到相关集合的反面

2024-06-28 15:18:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试为我的多级序列化程序编写create函数,但遇到此错误。这是我的密码-

我有型号。py

class Zorg(models.Model):

    name               = models.CharField(max_length=100)
    owner_first_name   = models.CharField(max_length=20)
    owner_last_name    = models.CharField(max_length=20)
    zorg_email_id     = models.EmailField(max_length=100)
    owner_email_id     = models.EmailField(max_length=100)
    open_year_of_zorg = models.CharField(max_length=4)
    website            = models.URLField(max_length=100)
    base_rating        = models.IntegerField(default=2)
    joined             = models.DateTimeField(auto_now_add=True, blank=True, null=True)


    def __str__(self):
        return self.name


class Categories(models.Model):
    zorg = models.ForeignKey(Zorg, on_delete=models.CASCADE, null=True, related_name='categories')
    category_name = models.CharField(max_length=100)

    def __str__(self):
        return self.category_name  + ' - ' + str(self.zorg) 


class Service(models.Model):
    category = models.ForeignKey(Categories, on_delete=models.CASCADE,null=True, related_name="services")
    service_name = models.CharField(max_length=100)
    time = models.PositiveIntegerField(default=0)
    price = models.DecimalField(max_digits=10, decimal_places=2, null=False)

    def __str__(self):
        return self.service_name + ' in ' + str(self.category)

这是我的序列化程序.py

class ServiceSerializer(serializers.ModelSerializer):

    class Meta:
        model = Service
        exclude = ['id', 'category']

class CategorySerializer(serializers.ModelSerializer):

    services = ServiceSerializer(many=True)
    class Meta:
        model = Categories
        fields = ['category_name', 'services']

class ZorgSerializer(serializers.ModelSerializer):

    categories = CategorySerializer(many=True)
    class Meta:
        model = Zorg
        fields = [
        'id',
        'name',
        'owner_first_name',
        'owner_last_name',
        'zorg_email_id',
        'owner_email_id',
        'open_year_of_zorg',
        'website',
        'base_rating',
        'categories',
        ]
    def create(self, validated_data):
        categories = validated_data.pop('categories')
        zorg = Zorg.objects.create(**validated_data)
        for category in categories:
            Categories.objects.create(zorg=zorg, **category)
            services = category.pop('services')
            for service in services:
                Service.objects.create(category=category, **service)
    return zorg

我正在尝试为它编写.create函数,但无法为zorg序列化程序编写正确的create函数。 GET工作得很好,我得到了预期的结果,但POST和PUT是我在多层次深度方面遇到困难的地方

这就是我希望以JSON格式传递数据的方式

{
    "id": 1,
    "name": "Sample",
    "owner_first_name": "Sample",
    "owner_last_name": "Sample",
    "salon_email_id": "sample@mail.com",
    "owner_email_id": "samplee@mail.com",
    "open_year_of_zorg": "2014",
    "website": "http://sample.in",
    "base_rating": 2,
    "categories": [
        {
            "category_name": "Sample Category",
            "services": [
                {
                    "service_name": "Sample Service",
                    "time": 30,
                    "price": "300.00"
                },
                {
                    "service_name": "Sample Service",
                    "time": 0,
                    "price": "100.00"
                }
            ]
        },
        {
            "category_name": "Sample Category 2",
            "services": [
                {
                    "service_name": "Sample Service 2",
                    "time": 50,
                    "price": "600.00"
                }
            ]
        }
    ]
}

这就是我得到的错误- Error


Tags: samplenameselfidtruemodelscreateservice
1条回答
网友
1楼 · 发布于 2024-06-28 15:18:45
def create(self, validated_data):          
        categories = validated_data.pop('categories')
        zorg = Zorg.objects.create(**validated_data)
        for category in categories:
            services = category.pop('services')
            category = Categories.objects.create(zorg=zorg, **category)
            
            for service in services:
                Service.objects.create(category=category, **service)
        return zorg

相关问题 更多 >