Как предоставить валидации для сериализатора PrimaryKeyRelatedField
Как добавить валидацию типа required=true в сериализатор primarykeyrelated?
models.py
class WorkLocation(models.Model):
city = models.CharField(max_length=255)
latitude = models.FloatField()
longtitude = models.FloatField()
serializers.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
и при добавлении в качестве поля в другой сериализатор вложенная проверка будет работать.