Django Rest:自动将数据添加到“必填”字段

时间:2018-01-19 15:02:46

标签: python django django-rest-framework httprequest

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

我的观点:

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

The Serializer:

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

    read_only_fields = ('user', 'done')

用户应该能够进行postrequest,只在标题中提供令牌,并将订单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)

哪个也行不通,因为Orderdicts是不可变的。 对于第一次(以及最后一次尝试,进一步阅读),我总是得到相同的答案:

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

最后我发现了this stackoverflow post,建议覆盖序列化程序中的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)

它也给了我同样的回应。我迷路了。如何解决这个问题的任何帮助将不胜感激! :)

2 个答案:

答案 0 :(得分:1)

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

<强>查看:

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

答案 1 :(得分:0)

错误来自序列化程序验证,该验证在调用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')