Skip to main content
 首页 » 编程设计

python之POST 一个包含外键的 json 请求并用 django 保存

2025年05月04日37JustinYoung

我正在发布一个我从 html 表单构建的 json 请求:

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

我正在使用这个 Django View 处理它:

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) 

我的 models.py 包含:

class Discipline(models.Model): 
    name = models.CharField(max_length=200) 
 
 
class Lesson(models.Model): 
    discipline = models.ForeignKey(Discipline, on_delete=models.CASCADE) 
    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') 

但是,我有一个错误:

django.db.utils.IntegrityError: NOT NULL constraint failed: cours_lesson.discipline_id

我是 Django 的新手,我不知道这是定义外键的正确方法,但这是我找到的唯一方法。

请您参考如下方法:

错误提示“NOT NULL 约束失败”。这意味着您的数据库表上没有任何值(value)。你必须像这样设置你的外键。

discipline = models.ForeignKey(Discipline, on_delete=models.CASCADE,null=True) 

之后,迁移您的数据库。现在,在您的 Lesson 表中,discipline 行填充为 Null,以便您稍后可以将其设置为另一个变量。