【问题标题】:Django Rest: Add data to a "required" field automaticallyDjango Rest:自动将数据添加到“必填”字段
【发布时间】:2018-01-19 15:02:45
【问题描述】:

我想为 Django Rest 框架中的必填字段自动分配一个值,而不必在 post 请求中给出该值。

我的观点:

class WaitercallCreate(CreateAPIView):
    serializer_class = WaitercallCreateSerializer
    permission_classes = (IsAuthenticated, )

序列化器:

class WaitercallCreateSerializer(serializers.ModelSerializer):
    class Meta:
        model = Waitercall
        fields = ('order', 'user', 'done', 'type_of_call')

    read_only_fields = ('user', 'done')

用户应该能够进行后请求,只需在标头中提供他们的令牌,并将订单 ID 作为正文。 我想将用户的默认值设置为请求用户。 我尝试在我的视图中覆盖 perform_create 方法,如下所示:

def perform_create(self, serializer):
        serializer.save(user=self.request.user)

这不起作用。然后我尝试像这样覆盖视图中的 create 方法:

def create(self, request, *args, **kwargs):
        data = request.data
        data['user'] = request.user
        serializer = self.get_serializer(data=data)
        serializer.is_valid(raise_exception=True)
        self.perform_create(serializer)
        headers = self.get_success_headers(serializer.data)
        return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)

这也不起作用,因为 Orderdict 是不可变的。对于第一次(也是最后一次尝试,请进一步阅读)我总是得到相同的响应:

{
    "user": [
        "This field is required."
    ]
}

最后我找到了thisstackoverflow 帖子,它建议覆盖序列化程序中的 create 方法。像这样:

def create(self, validated_data):
    print(self.context['request'].user)
    validated_data['user'] = self.context['request'].user
    return super(WaitercallCreateSerializer, self).create(validated_data)

它也给了我同样的回应。我迷路了。接下来我可以尝试什么?

【问题讨论】:

  • 您需要从fields 列表中排除您手动提供的字段。

标签: python django django-rest-framework httprequest


【解决方案1】:

错误来自序列化验证,在调用create 方法之前调用。因此,对create 方法的更改并没有什么不同。您可以通过调用序列化程序中不需要user 字段来解决此问题。这看起来像:

from rest_framework import serializers

class WaitercallCreateSerializer(serializers.ModelSerializer):
    user = serializers.JSONField(required=False)

    class Meta:
        model = Waitercall
        fields = ('order', 'user', 'done', 'type_of_call')
        read_only_fields = ('user', 'done')

【讨论】:

  • 感谢您的回答!即使用户是外键,这会起作用吗?还是我必须使用primarykeyrealtedfield?
【解决方案2】:

我也遇到了和你一样的问题。如果您使用的是通用视图,请执行以下操作:

观看次数:

def perform_create(self, serializer):
    serializer.save(user=self.request.user)

序列化器:

您只需在序列化程序中添加它即可保存用户。 PrimaryKeyRelatedField 用于使用其主键表示关系的目标。 read_only=True 将此字段设为只读。

class WaitercallCreateSerializer(serializers.ModelSerializer):
    user = serializers.PrimaryKeyRelatedField(read_only=True)
    class Meta:
        model = Waitercall
        fields = ('order', 'user', 'done', 'type_of_call')

【讨论】:

    猜你喜欢
    • 2016-09-18
    • 1970-01-01
    • 1970-01-01
    • 2013-11-12
    • 1970-01-01
    • 2014-04-02
    • 2020-02-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多