Как использовать сериализатор Django DRF для ManyToManyField - PullRequest
0 голосов
/ 18 марта 2020

Я пытаюсь написать сериализатор для моих моделей, который имеет ManyToManyField. Моя проблема, похоже, очень похожа на этот пример , но в настоящее время я не заинтересован в использовании SlugField и, тем не менее, мне не ясно, в чем заключается моя проблема.

models.py

class Objective(models.Model):
    objective_name = models.CharField(max_length=10)
    objective_description = models.CharField(max_length=30)

    def __str__(self):
        return self.objective_name

class Assessment(models.Model):
    objective = models.ManyToManyField(Objective)
    date_completed = models.DateField(auto_now_add=True)

serializers.py

class AssessmentSerializer(serializers.ModelSerializer):
    objective = serializers.PrimaryKeyRelatedField(many=True, read_only=True)

    class Meta:
        model = Assessment
        fields = ['name', 'date_completed', 'objective']

class ObjectiveSerializer(serializers.ModelSerializer):
    class Meta:
        model = Objective
        fields = '__all__'

Из документов DRF , я думал, что следующий POST создаст Объект оценки, в котором у меня уже есть два объекта Objective с номерами соответственно 3 и 4.

{
    "name": "Quiz 3",
    "objective": [
        3,
        4
    ]
}

Однако это создает объект оценки, но между ним и объектами нет никакой связи.

{
    "name": "Quiz 3",
    "date_completed": "2020-03-17",
    "objective": []
}

Мой сериализатор неверен, или я использую неверный синтаксис для POST, или есть другая проблема?

1 Ответ

1 голос
/ 18 марта 2020

Вы установили read_only=True - (drf do c) в поле objective. Если вы установите поле как read_only, DRF не будет принимать входные данные.

class AssessmentSerializer(serializers.ModelSerializer):
    objective = serializers.PrimaryKeyRelatedField(many=True, <b><strike>read_only=True</strike>, queryset=Objective.objects.all()</b>)

    class Meta:
        model = Assessment
        fields = ['name', 'date_completed', 'objective']
...