Фильтрация внешнего ключа на основе другого поля 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
Вернуться на верх