How can I add validations like required=true to the primarykeyrelated serializer?
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__"
A part of my data looks like:
"hourly_pay": 10,
"yearly_pay": 120,
"work_location": {
"city": "kottayam",
"latitude": 0.00001,
"longtitude": 0.0012
},
"Benefit": [
1
],
I need validations for the nested JSON data.
Judging from your JobPostSerializer
, it seems like your JobPost
model has a OneToOne
relationship with WorkLocation
.This means that your models.py
looks like this:
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)
To provide validation for work_location field on JobPostSerializer
, you can create WorkLocationSerializer
as follows:
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()
This way you can perform all of your validations inside the WorkLocationSerializer
and when added as a field on another serializer the nested validation works.
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.