【问题标题】:How I can pass over a field validation in a serializer in Django Rest Framework如何在 Django Rest Framework 的序列化程序中传递字段验证
【发布时间】:2014-08-06 21:23:53
【问题描述】:

我有一个 Location 模型,我需要在不指定用户的情况下创建一个 Location,如果用户为空,那么该用户将被放置在视图集中的 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 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)

感谢您的建议

【问题讨论】:

    标签: django django-rest-framework


    【解决方案1】:

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

    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 核心复制代码。

    【讨论】:

    • 工作得很好,但我必须通过以下方式更改 pre_save 方法:尝试:obj.user 除了 User.DoesNotExist:obj.user = self.request.user 如果可以请编辑您的答案以标记为正确感谢您的帮助
    • 你能在 pre_save 中试试 if obj.user_id is None: obj.user = self.request.user 并告诉我你是否仍然得到异常?我更喜欢这个解决方案而不是 try/except 块
    • 是的,if obj.user_id is None: obj.user = self.request.user 有效
    猜你喜欢
    • 2018-07-06
    • 1970-01-01
    • 2014-11-25
    • 2023-03-18
    • 2016-11-21
    • 1970-01-01
    • 2013-11-15
    • 1970-01-01
    • 2015-03-27
    相关资源
    最近更新 更多