【问题标题】:Integrity error in django foreign key field in django-rest-frameworkdjango-rest-framework 中 django 外键字段的完整性错误
【发布时间】:2019-10-12 14:27:26
【问题描述】:

我是 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") 我将模型字段命名为主管,而 db 字段就像 django 一样变成了 supervisor_id。但是,我该如何解决这个错误。 这可能是一件小事,但我不知道在哪里进行必要的调整。 请帮忙。

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

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

两者都产生相同的输出

【问题讨论】:

  • 请包含您的post请求的参数
  • @NadhemMaaloul 我确实请看一下。存在 id 为 1 的用户。
  • 您是否尝试过带有一个或两个下划线“_”的“supervisor_id”?
  • 我做了,没有看到不同的结果。
  • 我没有看到序列化程序中“主管”字段的必要性。因为你在类的元数据中有字段 = ('sitename', 'start_date', 'supervisor')

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


【解决方案1】:

Django 期望您传递一个用户对象而不是像您所做的那样传递一个 id,这就是它抛出完整性错误的原因。例如,如果主管是当前用户,则应该是 serializer.save(supervisor=request.user)

Ps:这是用我的手机输入的,希望我的代码标记正确。

【讨论】:

    【解决方案2】:

    我认为错误在于: supervisor = serializers.ReadOnlyField(source='supervisor.username') 你试过删除它吗?

    【讨论】:

      【解决方案3】:

      尝试:

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

      【讨论】:

      • 试过了,结果还是一样
      猜你喜欢
      • 2019-07-27
      • 2021-06-10
      • 2015-09-28
      • 1970-01-01
      • 1970-01-01
      • 2015-03-27
      • 2012-12-31
      • 2021-09-27
      • 1970-01-01
      相关资源
      最近更新 更多