如何在Django Rest框架中通过序列化程序中的字段验证

如何在Django Rest框架中通过序列化程序中的字段验证,django,django-rest-framework,Django,Django Rest Framework,我有一个位置模型,我需要在不指定用户的情况下创建一个位置,如果用户为空,则该用户将被放置在视图集中的request.user中 这是我的模型: class Location(models.Model): user = models.ForeignKey(User) name = models.CharField(max_length=100) 序列化程序: class LocationSerializer(serializers.ModelSerializer): d

我有一个位置模型,我需要在不指定用户的情况下创建一个位置,如果用户为空,则该用户将被放置在视图集中的request.user中

这是我的模型:

class Location(models.Model):
    user = models.ForeignKey(User)
    name = models.CharField(max_length=100)
序列化程序:

class LocationSerializer(serializers.ModelSerializer):

    def is_valid(self):
        if not 'user' in self.init_data:
            # avoid this validation.. I manage this in the viewset
            pass

        return not self.errors

    class Meta:
        model = Location
class LocationSerializer(serializers.ModelSerializer):
    user = serializers.RelatedField(required=False)
和视图集

class LocationViewSet(ModelViewSet):
    """
    API endpoint that allows location to be created or viewed.
    """
    model = Location
    serializer_class = LocationSerializer
    renderer_classes = (JSONRenderer, JSONPRenderer)

    def get_queryset(self):
        return self.request.user.locations.filter(deleted=False)

    def create(self, request, *args, **kwargs):
        serializer = self.get_serializer(data=request.DATA, files=request.FILES)

        if serializer.is_valid():
            self.pre_save(serializer.object)
            if not self.object.user:
                self.object.user = request.user
            self.object = serializer.save(force_insert=True)
            self.post_save(self.object, created=True)
            headers = self.get_success_headers(serializer.data)
            return Response(serializer.data, status=status.HTTP_201_CREATED,
                            headers=headers)

感谢您的建议

您可以在序列化程序中使用
required=False

class LocationSerializer(serializers.ModelSerializer):

    def is_valid(self):
        if not 'user' in self.init_data:
            # avoid this validation.. I manage this in the viewset
            pass

        return not self.errors

    class Meta:
        model = Location
class LocationSerializer(serializers.ModelSerializer):
    user = serializers.RelatedField(required=False)
编辑

此外,还可以通过以下方式简化视图集:

class LocationViewSet(ModelViewSet):
    def pre_save(self, obj):
        if obj.user_id is None:
            obj.user = self.request.user

这避免了从DRF核心复制代码。

工作正常,但我必须通过以下方式更改预保存方法:try:obj.user except user.DoesNotExist:obj.user=self.request.user如果您可以编辑您的答案以标记为正确谢谢您的帮助如果obj.user\u id为None:obj.user=self.request.user在预保存中,请告诉我如果你仍然得到例外?如果obj.user\u id为None:obj.user=self.request.user有效,我更喜欢这个解决方案,而不是try/except blockyes