DRF:使用主键数组反向外键分配

时间:2017-01-22 03:14:36

标签: python django django-rest-framework

this问题

中所述
  

使用Django REST Framework,标准ModelSerializer将允许通过将ID作为整数进行POST来分配或更改ForeignKey模型关系。

我正在尝试更新以下格式的反向关系:

class Lesson(models.Model):
    name = models.TextField()

class Quiz(models.Model):
    lesson = models.ForeignKey(Lesson, related_name='quizzes', null=True)

class LessonSerializer(serializers.ModelSerializer):
    quizzes = serializers.PrimaryKeyRelatedField(queryset=Quiz.objects.all(), many=True, write_only=True)

    class Meta:
        model = Lesson
        fields = ('quizzes')

使用LessonSerializer发布包含测验主键数组的更新时,我得到TypeError: 'Quiz' instance expected, got '1'

是否可以通过POST主键数组来分配或更改反向关系?

2 个答案:

答案 0 :(得分:0)

您不需要在串行器中使用特殊字段,DRF序列化器足够聪明,可以从fields值中找出相关字段。

class LessonSerializer(serializers.ModelSerializer):

    class Meta:
        model = Lesson
        fields = ('quizzes', 'name')

你应该传递id列表,如果只有一个值,它应该是一个列表。

答案 1 :(得分:0)

要解决此问题,您需要先创建一个Quiz实例,然后再将其分配给Lesson。以下是您的代码的一个小改动。

class Lesson(models.Model):
    name = models.TextField()

class Quiz(models.Model):
    lesson = models.ForeignKey(Lesson, related_name='quizzes', null=True)

class LessonSerializer(serializers.ModelSerializer):
    quizzes = serializers.PrimaryKeyRelatedField(queryset=Quiz.objects.all(), many=True, write_only=True)
    class Meta:
        model = Lesson
        fields = ('quizzes')

class QuizSerializer(serializers.ModelSerializer):
    class Meta:
        model = Quiz
        fields = ('name')


使用测验创建POST请求,然后再次运行您的帖子