【问题标题】:How to use the Django DRF serializer for ManyToManyField如何为 ManyToManyField 使用 Django DRF 序列化程序
【发布时间】:2020-03-18 01:55:49
【问题描述】:

我正在尝试为具有 ManyToManyField 的模型编写序列化程序。我的问题似乎非常similar to this example,但此时我对使用 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__'

来自the DRF docs,我认为以下 POST 将创建一个评估对象,其中我已经有两个 ID 分别为 3 和 4 的 Objective 对象。

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

但是,这会创建评估对象,但它与目标之间没有链接。

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

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

【问题讨论】:

    标签: django django-rest-framework django-serializer


    【解决方案1】:

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

    【讨论】:

    • 我在没有 read_only=True 的情况下尝试过,但这给了我这个错误:Relational field must provide a 'queryset' argument, override 'get_queryset', or set read_only='True.
    • @DougSmith 更新了答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-30
    • 1970-01-01
    • 2019-06-26
    • 1970-01-01
    相关资源
    最近更新 更多