Фильтрация внешнего ключа на основе другого поля SlugRelatedField в POST-запросах в Django Rest Framework
Я использую Django Rest Framework и имею модель с несколькими отношениями ForeignKey
и POST
использую их слизи, а не id
. Проблема в том, что второй ForeignKey
требует набора запросов, который фильтруется на основе первого. Вот не совсем удачный пример:
# models.py
class Student(models.Model):
slug = models.SlugField(...)
class Class_(models.Model):
slug = models.SlugField(...)
class ReportCard(models.Model)
student = models.ForeignKey(Student)
class_ = models.ForeignKey(Class_)
grade = models.CharField(...)
# serializers.py
class ReportCardSerializer(serializers.ModelSerializer):
student = serializers.SlugRelatedField(queryset=models.Student.objects.all(), slug_field='slug')
class_ = serializers.SlugRelatedField(queryset=models.Class_.objects.filter(???), slug_field='slug') # need to filter based on student here
class Meta:
model = models.ReportCard
fields = '__all__' # use all fields
Как мне это сделать? student
в сериализаторе не возвращает модель, и я не знаю, как получить доступ к данным внутри ReportCardSerializer
, чтобы взять строку из запроса POST
, чтобы вручную отфильтровать class_
.
В вашем случае вам не нужно проверять валидность в запросе get, достаточно проверки в запросе post, поэтому переопределите метод validate:
class ReportCardSerializer(serializers.ModelSerializer):
student = serializers.SlugRelatedField(queryset=models.Student.objects.all(), slug_field='slug')
class_ = serializers.SlugRelatedField(queryset=models.Class_.objects.all(), slug_field='slug')
class Meta:
model = models.ReportCard
fields = '__all__'
def validate(self, data):
student = data.get('student')
class_ = data.get('class_')
if check class_ is valid for the student, if not raise error:
raise serializers.ValidationError("class_ is invalid")
return data