如何使用Django序列化器实现ForeignKey

时间:2016-02-07 17:19:58

标签: json django

我有这个型号:

class Discipline(models.Model):
    name = models.CharField(max_length=200)

class Lesson(models.Model):
    discipline = models.ForeignKey(Discipline, on_delete=models.CASCADE, null=True)
    date = models.DateField()
    regular_slot = models.BooleanField(default=False)

这些序列化器:

class DisciplineSerializer(serializers.ModelSerializer):
    class Meta:
        model = Discipline
        fields = ('name')

class LessonSerializer(serializers.ModelSerializer):
    discipline = serializers.RelatedField(source='Discipline', read_only=True);
    class Meta:
        model = Lesson
        fields = ('discipline', 'date', 'regular_slot')

我有一个处理JSON请求并保存数据的视图:

def cours_list(request):
    if request.method == 'POST':
        data = JSONParser().parse(request)
        serializer = LessonSerializer(data=data)

    if serializer.is_valid():
        serializer.save()
        return JSONResponse(serializer.data, status=201)

    return JSONResponse(serializer.errors, status=400)

我的JSON请求如下:

 {"discipline":"Mathematiques","date":"2017-12-03"}

但是,我有一个错误说:

  

'Lesson'对象没有属性'Discipline'

我认为这是因为discipline中的属性Lesson仅指ID,而不是Discipline类型。我无法找到解决这个问题的方法。我定义foreignKey的方式是不正确的?

当我从JSON请求收到Discipline对象时,如何在此处插入foreignKey引用?

1 个答案:

答案 0 :(得分:0)

我也会帮助你:)

class DisciplineSerializer(serializers.ModelSerializer):
class Meta:
    model = Discipline
    fields = ('name')

class LessonSerializer(serializers.ModelSerializer):
discipline = DiscliplineSerializer()
class Meta:
    model = Lesson
    fields = ('discipline', 'date', 'regular_slot')

据我所知,这样做就足够了。

编辑:您的错误原因是您编写了“source =”Discipline“”,但您的课程模型中没有名为Discipline的字段。因此,它会出错。