相关疑难解决方法(0)

如何在DRF中的ListSerializer父类上访问serializer.data?

我在尝试访问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)

python django django-rest-framework

11
推荐指数
2
解决办法
6504
查看次数

在django-rest-framework 3.x中进行批量创建的规范方法?

在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中创建了类,必须有一个更清晰的方法来做到这一点.提前致谢.

python django django-rest-framework

9
推荐指数
1
解决办法
5003
查看次数

如何在 django API 中一次更新多个记录(批量更新)

我需要在一个请求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)

python django django-serializer

6
推荐指数
1
解决办法
6619
查看次数