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



当我在文档上实现这个代码示例时(我不得不自己实现创建方法,因为我有嵌套的对象,默认情况下不支持插入它们(

def create(self, validated_data):
profile_data = validated_data.pop('profile')
user = User.objects.create(**validated_data)
Profile.objects.create(user=user, **profile_data)
return user

https://www.django-rest-framework.org/api-guide/serializers/#writing-创建嵌套表示的方法

我收到这个错误

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

我的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')

有人能帮我找出问题吗?

您在这里混淆了各种名称。从validated_data弹出categories元素,并将其分配给product_data;但这不是产品数据,而是一个类别列表。

然后,您尝试使用与现有产品相关的数据创建一个产品——大概您打算在那里创建一个类别。但同样,您拥有的是一个列表,因此您需要迭代并为每个条目创建一个类别。

最后请注意,产品和类别之间存在多对多关系,而不是像示例中那样的外键,因此不能使用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支持创建嵌套项;请参阅有关序列化程序关系的文档。(

所以我会添加这个答案,以防你像我一样是个傻瓜。

我之前有类似的代码,并对我从中获取JSON的Flask应用程序的端点进行了一些更改。

我添加的更改之一是向字典中添加一个count项,这样我就可以很容易地看到我迭代了多少项。

因此,很明显,当我基于JSON数据将每个模型实例保存在Django中时,第一项有一个用于计数的整数值,这显然是行不通的。

最新更新