2017-01-30 5 views
0

Я прошел через связанные вопросы и не нашел никакого решения.Переопределить проверку валидации в Django Rest с ModelSerializer

Посмотреть

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) 

Serializer

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') 

ModelSerializer Теста ожидает поле местоположения в рк. Но я хочу получить полты долготы широты и создать объект Location перед сохранением тестовой модели.

Сообщение Формат запроса

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

Я хочу принять данные о местоположении, создать объект местоположения, а затем передать, что для тестирования модели. Я написал специальную проверку и попытался переопределить «ожидаемую ошибку значения pk». Но это не работает. Как переопределить ошибку проверки?

ответ

0

В вашей модели добавить 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.

Смежные вопросы