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

如何为ManyToManyField使用Django DRF序列化程序,django,django-rest-framework,django-serializer,Django,Django Rest Framework,Django Serializer,我正在尝试为我的模型编写一个序列化程序,它有许多字段。我的问题似乎很严重,但目前我对使用SlugField不感兴趣,但我不清楚我的问题是什么 models.py class Objective(models.Model): objective_name = models.CharField(max_length=10) objective_description = models.CharField(max_length=30) def __str__(self):

我正在尝试为我的模型编写一个序列化程序,它有许多字段。我的问题似乎很严重,但目前我对使用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)
序列化程序.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__'
从中,我认为下面的帖子将创建一个评估对象,其中我已经有两个id分别为3和4的客观对象

{
    "name": "Quiz 3",
    "objective": [
        3,
        4
    ]
}
但是,这会创建评估对象,但它与目标之间没有联系

{
    "name": "Quiz 3",
    "date_completed": "2020-03-17",
    "objective": []
}
是我的序列化程序不正确,还是我对文章使用了错误的语法,还是存在其他问题?

您在
目标
字段中设置的。如果将字段设置为只读,DRF将不获取输入数据

class AssessmentSerializer(serializers.ModelSerializer):
    objective = serializers.PrimaryKeyRelatedField(many=True, read_only=True, queryset=Objective.objects.all())

    class Meta:
        model = Assessment
        fields = ['name', 'date_completed', 'objective']
class AssessmentSerializer(serializers.ModelSerializer):
objective=serializers.PrimaryKeyRelatedField(many=True,read\u only=True,queryset=objective.objects.all())
类元:
模型=评估

fields=['name'、'date_completed'、'objective']
我在没有read_only=True的情况下尝试了它,但这给了我一个错误:
关系字段必须提供'queryset'参数,重写'get_queryset',或设置read_only='True。
@DougSmith更新了答案。