我在尝试访问serializer.data之前遇到错误,然后返回Response(serializer.data, status=something):
尝试获取
<field>序列化程序字段的值时获取KeyError<serializer>.
这发生在所有字段上(因为事实证明我试图访问.data父节点而不是子节点,见下文)
类定义如下所示:
class BulkProductSerializer(serializers.ModelSerializer):
list_serializer_class = CustomProductListSerializer
user = serializers.CharField(source='fk_user.username', read_only=False)
class Meta:
model = Product
fields = (
'user',
'uuid',
'product_code',
...,
)
Run Code Online (Sandbox Code Playgroud)
CustomProductListSerializer是一个serializers.ListSerializer有一个重写的save()方法,允许它正确处理批量创建和更新.
以下是批量产品的示例视图ViewSet:
def partial_update(self, request):
serializer = self.get_serializer(data=request.data,
many=isinstance(request.data, list),
partial=True)
if not serializer.is_valid():
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
serializer.save()
pdb.set_trace()
return Response(serializer.data, status=status.HTTP_200_OK)
Run Code Online (Sandbox Code Playgroud)
试图访问serializer.data跟踪(或明显后面的行)会导致错误.这是完整的跟踪(tl; dr跳过下面我用调试器诊断的地方):
Traceback (most recent call last):
File "/lib/python3.5/site-packages/django/core/handlers/exception.py", line 41, in …Run Code Online (Sandbox Code Playgroud) 在2.x中我们有一个看起来像的序列化器:
class FooSerializer(serializers.ModelSerializer):
bar = serializers.PrimaryKeyRelatedField()
class Meta:
model = Foo
Run Code Online (Sandbox Code Playgroud)
这实际上能够处理批量创建(传递list作为JSON帖子请求的主体).在3.x中,此端点已损坏.我试图实现类似于DRF文档的东西
class FooListSerializer(serializers.ListSerializer):
def create(self, validated_data):
foos = [Foo(**item) for item in validated_data]
return Foo.objects.bulk_create(foos)
class FooSerializer(serializers.ModelSerializer):
bar = serializers.PrimaryKeyRelatedField(
queryset=Bar.objects.all()
)
class Meta:
model = Foo
list_serializer_class = FooListSerializer
Run Code Online (Sandbox Code Playgroud)
虽然这适用于单个创建请求,但当我尝试传递列表时,我收到错误:
AttributeError: 'FooListSerializer' object has no attribute 'object'
Run Code Online (Sandbox Code Playgroud)
我已经看到一些__init__超级硬件,但似乎ListSerializer在3.x中创建了类,必须有一个更清晰的方法来做到这一点.提前致谢.
我需要在一个请求categories中多次更新Article。
在ArticleViewSet我有:
def get_serializer_class(self):
if self.action in ['partial_update', 'update']:
return ArticlePostSerializer
return ArticleSerializer
Run Code Online (Sandbox Code Playgroud)
所以ArticlePostSerializer需要改变。
这是我的序列化程序代码:
class ArticleShortCategorySerializer(serializers.ModelSerializer):
class Meta:
model = Category
fields = 'id', 'name'
class ArticleSerializer(serializers.ModelSerializer):
categories = serializers.SerializerMethodField()
def get_categories(self, obj):
return ArticleShortCategorySerializer(obj.categories, many=True).data
class Meta:
model = Article
read_only_fields = 'id'
fields = ('categories', 'text') + read_only_fields
class ArticlePostSerializer(serializers.ModelSerializer):
class Meta:
model = Article
fields = 'id', 'categories', 'text'
Run Code Online (Sandbox Code Playgroud)
我尝试添加:
class ArticlePostListSerializer(serializers.ListSerializer):
Run Code Online (Sandbox Code Playgroud)
和
class Meta:
list_serializer_class = ArticlePostListSerializer …Run Code Online (Sandbox Code Playgroud)