django-rest-framework中Django外键字段中的完整性错误

时间:2019-05-27 01:59:43

标签: python django django-rest-framework foreign-keys

我在Django中还很陌生。我有一个外键字段作为主管,如下所示

class Site(models.Model):
sitename=models.CharField(max_length=255)
start_date=models.DateTimeField
supervisor=models.ForeignKey(User,on_delete=models.PROTECT)
created = models.DateTimeField(auto_now_add=True)
updated = models.DateTimeField(auto_now=True)

def __str__(self):
    return "{}".format(self.sitename)

为此的序列化器是:

class SiteSerializer(serializers.ModelSerializer):

supervisor = serializers.ReadOnlyField(source='supervisor.username')

class Meta:
    model = Site
    fields = ('sitename', 'start_date', 'supervisor') 

其视图为:

@csrf_exempt
def site_list(request):
    """
    List all code snippets, or create a new snippet.
    """
    if request.method == 'GET':
        sites = Site.objects.all()
        serializer = SiteSerializer(sites, many=True)
        return JsonResponse(serializer.data, safe=False)

    elif request.method == 'POST':

    data = JSONParser().parse(request)


    serializer = SiteSerializer(data=data)

    if serializer.is_valid():
        serializer.save()
        return JsonResponse(serializer.data, status=201)
    return JsonResponse(serializer.errors, status=400)

每当我发布邮递员的数据时,都会说IntegrityError at /sites/ (1048, "Column 'supervisor_id' cannot be null") 我将模型字段命名为supervisor,而django则将db字段命名为supervisor_id。但是,我该如何解决该错误。 这可能是一件很小的事情,但我无法弄清楚在哪里做出调整。 请帮忙。

我的帖子请求是{ "sitename" : "Tony Tower", "start_date" :"2019-5-5", "supervisor" : "1" }

{
"sitename" : "Putalisadak",
"start_date" :"2019-5-5",
"supervisor_id" : "1"
}

两者都产生相同的输出

3 个答案:

答案 0 :(得分:1)

Django希望您传递User对象而不是像过去那样传递id,这就是为什么它引发完整性错误的原因。例如,如果主管是当前用户,则应为serializer.save(supervisor=request.user)

Ps:使用手机输入此内容,希望我的代码标记正确无误。

答案 1 :(得分:0)

尝试:

   {
    "sitename" : "Tony Tower",
    "start_date" :"2019-5-5",
    "supervisor__id" : "1"
}

答案 2 :(得分:0)

我认为错误就在这行:超级用户= serializers.ReadOnlyField(source ='supervisor.username') 您尝试删除它了吗?