Проблемы с сериализатором Django Rest Framework для работы с вложенными данными

Я работаю над проектом Django, используя Django Rest Framework (DRF), и сталкиваюсь с проблемами сериализации и десериализации вложенных данных для моей модели Child. Вот краткое описание моей установки и проблемы:

** У меня есть следующие модели Django: **

class Hobbies(models.Model):
    name = models.CharField(max_length=255)

    def __str__(self):
        return self.name

class BehaviorChallenges(models.Model):
    name = models.CharField(max_length=255)

    def __str__(self):
        return self.name

class StandardTestScore(models.Model):
    name = models.CharField(max_length=255)

    def __str__(self):
        return self.name

class Child(models.Model):
    parent = models.ForeignKey(CustomUser, on_delete=models.CASCADE)
    name = models.CharField(max_length=255)
    age = models.CharField(max_length=3)
    gender = models.CharField(max_length=20)
    learning_style = models.CharField(max_length=100)
    gpa = models.DecimalField(max_digits=4, decimal_places=2)
    grade = models.CharField(max_length=10)
    hobbies = models.ManyToManyField(Hobbies, related_name="children")
    behavior_challenges = models.ManyToManyField(BehaviorChallenges, related_name="children")
    standard_test_score = models.ManyToManyField(StandardTestScore, through='TestScoreThroughModel', related_name="children")
    adding_date = models.DateField(auto_now_add=True)
    is_active = models.BooleanField(default=False)

    def __str__(self):
        return self.name

class TestScoreThroughModel(models.Model):
    child = models.ForeignKey(Child, on_delete=models.CASCADE)
    standard_test_score = models.ForeignKey(StandardTestScore, on_delete=models.CASCADE)
    score = models.IntegerField()

** Вот ChildSerializer, который я настроил: **

class TestScoreThroughModelSerializer(serializers.ModelSerializer):
    id = serializers.PrimaryKeyRelatedField(queryset=StandardTestScore.objects.all())
    score = serializers.IntegerField()

    class Meta:
        model = TestScoreThroughModel
        fields = ['id', 'score']

class ChildSerializer(serializers.ModelSerializer):
    hobbies = serializers.PrimaryKeyRelatedField(many=True, queryset=Hobbies.objects.all())
    behavior_challenges = serializers.PrimaryKeyRelatedField(many=True, queryset=BehaviorChallenges.objects.all())
    standard_test_score = TestScoreThroughModelSerializer(many=True, source='testscorethroughmodel_set')

    class Meta:
        model = Child
        fields = [
            'parent', 'name', 'age', 'gender', 'learning_style', 'gpa', 'grade', 
            'hobbies', 'behavior_challenges', 'standard_test_score'
        ]

    def create(self, validated_data):
        test_scores_data = validated_data.pop('testscorethroughmodel_set', [])
        child = Child.objects.create(**validated_data)
        for test_score_data in test_scores_data:
            TestScoreThroughModel.objects.create(child=child, **test_score_data)
        return child

**Когда я отправляю следующую полезную нагрузку JSON с помощью Postman, я получаю ошибки валидации: **

{
    "parent": 1,
    "name": "John Doe",
    "age": "10",
    "gender": "Male",
    "learning_style": "Visual",
    "gpa": "3.5",
    "grade": "5",
    "hobbies": [1, 2],
    "behavior_challenges": [1],
    "standard_test_score": [
        {"id": 1, "score": 85},
        {"id": 2, "score": 90}
    ]
}


Ошибки:

{
    "hobbies": [
        "Incorrect type. Expected pk value, received str."
    ],
    "behavior_challenges": [
        "Incorrect type. Expected pk value, received str."
    ],
    "standard_test_score": [
        "This field is required."
    ]
}

Проверка типов данных: Убедились, что hobbies и behavior_challenges отправляются как массивы целых чисел.

Проверка standard_test_score: Убедились, что standard_test_score отправляется в виде массива объектов с id и оценкой.

The error *"This field is required."* standard_test_score field is not correctly mapped.

correct code:
class TestScoreThroughModelSerializer(serializers.ModelSerializer):
    standard_test_score = serializers.PrimaryKeyRelatedField(queryset=StandardTestScore.objects.all())
    score = serializers.IntegerField()

    class Meta:
        model = TestScoreThroughModel
        fields = ['standard_test_score', 'score']
# Remaining errors indicated that 
The serializer is expecting primary key values (integers) for hobbies and behavior_challenges, but it’s receiving string values.
The array you are passing it's getting passed as a string from POSTMAN. Just print and check.

Ваш код должен работать, если настройки и представления тоже правильные. Я повторил ваш код, и все работает правильно. Можете ли вы дать какую-нибудь информацию о представлениях?

Вернуться на верх