如何为 ManyToManyField 使用 Django DRF 序列化程序

How to use the Django DRF serializer for ManyToManyField

我正在尝试为我的模型编写一个序列化程序,它有一个 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__'

the DRF docs 开始,我认为下面的 POST 会创建一个评估对象,其中我已经有两个 Objective 对象,id 分别为 3 和 4。

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

但是,这会创建评估对象,但它与 Objective 之间没有 link。

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

是我的序列化程序不正确,还是我对 POST 使用了错误的语法,还是存在其他问题?

您已在 objective 字段中设置 read_only=True--(drf doc)。如果您将字段设置为 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']