Я иду шаг за шагом.
Во-первых, вам нужно определить сериализатор для координат, потому что стандартный способ получения и проверки пользовательского ввода - через сериализаторы. так:
class Coordinates(serializers.Serializer):
latitude = serializers.FloatField(min_value=-90, max_value=90)
longitude = serializers.FloatField(min_value=-180, max_value=180)
так что установка минимального и максимального значения для полей делает достаточно проверки, я думаю. если вам нужна дополнительная проверка этих полей, вы можете использовать проверка на уровне полей .
секунду, используйте serializer.ModelSerializer
для AuthTokenSerializer
, затем добавьте в это поле:
coords = Coordinates(write_only=True)
и сделайте это write_only .
также вы можете использовать PrimaryKeyRelatedField
для получения университета, как это:
university = serializers.PrimaryKeyRelatedField(queryset=University.objects.all(), write_only=True)
пока ваш сериализатор должен выглядеть так:
class AuthTokenSerializer(serializers.ModelSerializer):
university = serializers.PrimaryKeyRelatedField(queryset=University.objects.all(), write_only=True)
coords = Coordinates(write_only=True)
class Meta:
model = AuthToken
fields = ('key', 'created', 'coords', 'university')
на следующем шаге вы должны сделать key
и created
read_only , потому что вы не хотите получать их значения из пользовательского ввода, вы только хотите показать их значение пользователь после создания экземпляра AuthToken
. так что добавьте их к read_only_fields
в классе Meta.
на следующем шаге вы должны переопределить метод сериализатора validate
и выполнить проверку, основанную на более чем одном поле (
проверяет, находятся ли координаты внутри допустимой области
)
def validate(self, attrs):
### the the validation here, something like this
### you can access the selected university instance: attrs['university']
if attrs['coords']['latitude'] < attrs['university']:# blah blah blah, anyway you want to validate
raise serializers.ValidationError({'coords': ['invalid coords']})
return super().validate(attrs)
поэтому на последнем шаге вы должны переопределить метод create
и вытолкнуть поля, которых у вас нет в вашей модели (университет и координаты):
def create(self, validated_data):
### your AuthToken does not have this field, you should pop university and coords
### out before creating an instance of Authtoken
validated_data.pop('university')
validated_data.pop('coords')
return super().create(validated_data)
наконец, ваш сериализатор будет выглядеть так:
class AuthTokenSerializer(serializers.ModelSerializer):
university = serializers.PrimaryKeyRelatedField(queryset=University.objects.all(), write_only=True)
coords = Coordinates(write_only=True)
class Meta:
model = AuthToken
fields = ('key', 'created', 'coords', 'university')
read_only_fields = ('key', 'created')
def validate(self, attrs):
### the the validation here, something like this
### you can access the selected university instance: attrs['university']
if attrs['coords']['latitude'] < attrs['university']:# blah blah blah, anyway you want to validate
raise serializers.ValidationError({'coords': ['invalid coords']})
return super().validate(attrs)
def create(self, validated_data):
### your AuthToken does not have this field, you should pop university and coords
### out before createing an instance of Authtoken
validated_data.pop('university')
validated_data.pop('coords')
return super().create(validated_data)