Python **后面的create()参数必须是映射,而不是列表,Django REST框架(实现我自己的create方法错误)

Python **后面的create()参数必须是映射,而不是列表,Django REST框架(实现我自己的create方法错误),python,django,django-rest-framework,Python,Django,Django Rest Framework,当我在文档中实现这个代码示例时(我必须自己实现create方法,因为我有嵌套对象,默认情况下不支持插入它们) 我犯了这个错误 create() argument after ** must be a mapping, not list 我在我的项目中实施的示例如下: def create(self, validated_data): product_data = validated_data.pop('categories') product = Product.object

当我在文档中实现这个代码示例时(我必须自己实现create方法,因为我有嵌套对象,默认情况下不支持插入它们)

我犯了这个错误

create() argument after ** must be a mapping, not list
我在我的项目中实施的示例如下:

def create(self, validated_data):
    product_data = validated_data.pop('categories')
    product = Product.objects.create(**validated_data)
    Product.objects.create(product=product, **product_data)
    return product
整个serializers.py文件

from rest_framework import serializers
from products_and_categories.models import Product, Category
from django.db import models


class CategorySerializer(serializers.ModelSerializer):
    def to_representation(self, obj):
        if 'categories' not in self.fields:
            self.fields['categories'] = CategorySerializer(obj, many=True)      
        return super(CategorySerializer, self).to_representation(obj)

    class Meta:
        model = Category
        fields = ("name", 'products', 'categories')

class ProductSerializer(serializers.ModelSerializer):
    categories = CategorySerializer(many=True)
    class Meta:
        model = Product
        fields = ("product_code", "name", "quantity", "price", 'categories')

    def create(self, validated_data):
        product_data = validated_data.pop('categories')
        product = Product.objects.create(**validated_data)
        Product.objects.create(product=product, **product_data)
        return product
my models.py文件:

from django.db import models

# Create your models here.

class Category(models.Model):
    name = models.CharField(max_length=255)
    categoriesId = models.ForeignKey('self', related_name='categories',on_delete=models.CASCADE, blank=True, null=True)

class Product(models.Model):
    product_code = models.CharField(max_length=255)
    name = models.CharField(max_length=255)
    price = models.IntegerField()
    quantity = models.IntegerField()
    categories = models.ManyToManyField(Category, related_name='products')

有谁能帮我弄清楚出了什么问题吗?

你把这里的名字弄混了。您可以从
验证的_数据
中弹出
类别
元素,并将其分配给
产品_数据
;但这不是产品数据,而是一个类别列表

然后,您尝试使用与现有产品相关的数据创建一个产品-可能您打算在那里创建一个类别。但同样,您拥有的是一个列表,所以您需要遍历并为每个条目创建一个类别

最后请注意,product和category之间存在多对多关系,而不是示例中的外键,因此不能使用
product=product
语法

最好是:

def create(self, validated_data):
    category_data = validated_data.pop('categories')
    product = Product.objects.create(**validated_data)
    for category in category_data:
        product.categories.create(**category)
    return product

(请注意,是的,DRF支持创建嵌套项;请参阅上的文档。)

您在这里混淆了各种名称。您可以从
验证的_数据
中弹出
类别
元素,并将其分配给
产品_数据
;但这不是产品数据,而是一个类别列表

然后,您尝试使用与现有产品相关的数据创建一个产品-可能您打算在那里创建一个类别。但同样,您拥有的是一个列表,所以您需要遍历并为每个条目创建一个类别

最后请注意,product和category之间存在多对多关系,而不是示例中的外键,因此不能使用
product=product
语法

最好是:

def create(self, validated_data):
    category_data = validated_data.pop('categories')
    product = Product.objects.create(**validated_data)
    for category in category_data:
        product.categories.create(**category)
    return product

(请注意,是的,DRF支持创建嵌套项;请参阅上的文档。)

非常感谢,尽管在尝试您的方法后,我收到一个错误,即禁止直接分配到多对多集合的反面。使用products.set()。当我使用
product.categories.set(**category\u data)
时,我得到了
set()一个意外的关键字参数“name”
知道这是什么吗?这段代码不会给出那个错误。您能用您使用的确切代码更新您的问题吗?您是指
产品.类别中的
类别数据
。创建(**类别数据)
,对吗?因为除此之外,它在**之后给出了
create()参数**必须是一个映射,而不是list
error againI刚才假设您的意思是
**category
,而不是
**category\u data
,非常感谢,尽管在尝试了您的方法之后,我得到一个错误,说禁止直接分配到多对多集合的反面。使用products.set()。
当我使用
product.categories.set(**category\u data)
时,我得到了
set()一个意外的关键字参数“name”
知道这是什么吗?这段代码不会给出那个错误。您能用您使用的确切代码更新您的问题吗?您是指
产品.类别中的
类别数据
。创建(**类别数据)
,对吗?因为在**之后给出的
create()参数必须是一个映射,而不是list
error againI只是假设您指的是
**category
,而不是
**category\u data