【问题标题】:Override a validation check in Django Rest with ModelSerializer使用 ModelSerializer 覆盖 Django Rest 中的验证检查
【发布时间】:2017-06-15 07:16:23
【问题描述】:

我浏览了相关问题,但没有找到任何解决方案。

查看

class TestList(viewsets.ModelViewSet):

    serializer_class = TestSerializer
    queryset = Test.objects.all()

型号

class Location(models.Model):
    latitude = models.CharField(max_length=100)
    longitude = models.CharField(max_length=100)

class Test(models.Model):
    video_id = models.CharField(max_length=100)
    location = models.ForeignKey(Location)

序列化器

class LocationSerializer(serializers.ModelSerializer):

    class Meta:
        model = Location
        fields = ('latitude', 'longitude')


class TestSerializer(serializers.ModelSerializer):

    def validate_location(self, data):
        if type(data['location']) == dict:
            if not (type(data["location"]["latitude"]) == str and len(data["location"]["latitude"]) < 100):
                raise serializers.ValidationError("Latitude field error")
            if not (type(data["location"]["longitude"]) == str and len(data["location"]["longitude"]) < 100):
                raise serializers.ValidationError("Longitude field error")
        else:
            raise serializers.ValidationError("Wrong type")
        return data

    def create(self, validated_data):
        print validated_data
        loc_details = validated_data.pop('location')
        location = Location.objects.create(**loc_details)
        return Test.objects.create(location=location, **validated_data)

    class Meta:
        model = Test
        fields = ('video_id', 'emotions', 'location')

Test 的 ModelSerializer 需要 location 字段为 pk。但是我想在保存测试模型之前接收一个纬度经度字段并创建一个 Location 对象。

发布请求格式

{
    "video_id": "sdasd",
    "location": {"latitude":"52.345","longitude":"56.756"}
}

我想获取位置详细信息,创建位置对象,然后将其传递给测试模型。我编写了自定义验证并试图覆盖“预期的 pk 值错误”。但它不起作用。如何覆盖验证错误?

【问题讨论】:

    标签: python django python-2.7 django-rest-framework


    【解决方案1】:

    在你的模型中添加related_name,:

    class Location(models.Model):
        latitude = models.CharField(max_length=100)
        longitude = models.CharField(max_length=100)
    
    class Test(models.Model):
        video_id = models.CharField(max_length=100)
        location = models.ForeignKey(Location, related_name='locations')
    

    像这样制作你的序列化器:

    class TestSerializer(serializers.ModelSerializer):
        class Meta:
            model = Test
    
    class LocationSerializer(serializers.ModelSerializer):
        locations = TestSerializer(required=False)
        class Meta:
            model = Location
    

    在您看来,仅包括 LocationSerializer。

    【讨论】:

      猜你喜欢
      • 2014-05-03
      • 1970-01-01
      • 2020-03-05
      • 2018-08-01
      • 2020-07-29
      • 2020-02-02
      • 2016-06-01
      • 1970-01-01
      • 2015-05-30
      相关资源
      最近更新 更多