簡體   English   中英

如何驗證 PrimaryKeyRelatedField 序列化器

[英]How to give validations for a PrimaryKeyRelatedField serializer

如何將 required=true 之類的驗證添加到 primarykeyrelated 序列化程序?

模型.py

class WorkLocation(models.Model):
    city = models.CharField(max_length=255)
    latitude = models.FloatField()
    longtitude = models.FloatField()

序列化程序.py

class WorkLocationField(serializers.PrimaryKeyRelatedField):

    queryset = WorkLocation.objects.all()

    def to_internal_value(self, data):
        if type(data) == dict:
            location, created = WorkLocation.objects.get_or_create(**data)
            data = location.pk
        return super().to_internal_value(data)

class JobPostSerializer(serializers.ModelSerializer):

    work_location = WorkLocationField()

    class Meta:
        model = JobPost
        fields = "__all__"

我的部分數據如下所示:

"hourly_pay": 10,
    "yearly_pay": 120,
    "work_location": {
        "city": "kottayam",
        "latitude": 0.00001,
        "longtitude": 0.0012
    },
    "Benefit": [
        1
    ],

我需要對嵌套的 JSON 數據進行驗證。

從你的情況來看JobPostSerializer ,好像你JobPost模式有一個OneToOne有關系WorkLocation 。這意味着你的models.py如下所示:

class WorkLocation(models.Model):
    city = models.CharField(max_length=255)
    latitude = models.FloatField()
    longtitude = models.FloatField()

class JobPost(models.Model):
    work_location = models.OneToOneField(WorkLocation, on_delete=models.CASCADE)

為了提供work_location現場驗證的JobPostSerializer ,您可以創建WorkLocationSerializer如下:

class WorklocationSerializer(serializers.ModelSerializer):
    class Meta:
        model = WorkLocation
        fields = "__all__"

    # field level validation
    def validate_city(self, value):
        # value validation
        return value

    def validate(self, data):
        # data validation
        return data

class JobPostSerializer(serializers.ModelSerializer):
    class Meta:
        model = JobPost
        fields = "__all__"

    work_location = WorkLocationSerializer()

通過這種方式,您可以在WorkLocationSerializer執行所有驗證,並且當作為字段添加到另一個序列化器上時,嵌套驗證會起作用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM