【问题标题】:NOT NULL constraint failed: portal_visitrequests.visitor_idNOT NULL 约束失败:portal_visitrequests.visitor_id
【发布时间】:2019-05-06 00:44:03
【问题描述】:

我对 django 非常陌生,并且我一直在与这个特定项目作斗争一段时间。每次我尝试提交表单(最终创建 Visitor 和 VisitRequests 对象)时,都会收到非空约束错误。错误来自这行代码...visit_request = VisitRequests(staff=staff, visitor=visitor, comment=comment, token=token, status=None).save()... 请查看下面的代码。

views.py

def formpage(request):
    if request.method=='POST':
        token=secrets.token_urlsafe(20)
        visitor_name=request.POST.get('visitorsname')
        comment=request.POST.get('comment')
        visit_type=request.POST.get('visit_type')
        visit_content='You have a waiting visitor'+'\n'+'Name:'+visitor_name+'\n'+'Purpose Of Visit:'+visit_type+'\n'+'Additional Comment:'+comment+'\n'+token
        staff_id=request.POST.get('staff')
        staff=Staff.objects.get(id=staff_id)
        staff_email=staff.staff_email
        req_comment = request.POST.get('req_comment')
        request_id = (request.POST.get('request_id'))
        visitor=Visitor(visitor_name=visitor_name).save()
        visit_request = VisitRequests(staff=staff, visitor=visitor, comment=comment, token=token, status=None).save()

models.py

class Staff(models.Model):
    staff_name = models.CharField(max_length=250)
    staff_email = models.CharField(max_length=250, default="")

    def __str__(self):
        return self.staff_name

class Visitor(models.Model):
    visitor_name = models.CharField(max_length=250)
    timestamp = models.DateTimeField(default=timezone.now)

    def __str__(self):
        return '{}'.format(self.visitor_name)

class VisitRequests(models.Model):
    staff=models.ForeignKey(Staff, on_delete=models.CASCADE)
    visitor = models.ForeignKey(Visitor, on_delete=models.CASCADE)
    comment= models.TextField(default='')
    status= models.NullBooleanField()
    token=models.CharField(max_length=20)

【问题讨论】:

  • 我建议在保存对象之前放置 pdb 语句并查看错​​误。我的第一个猜测是 VisitRequest 构造函数的输入之一是 None。
  • 使用创建而不是保存
  • @seuling。谢谢

标签: python django


【解决方案1】:

您的实现假设 Django 的 save 返回模型对象,但事实并非如此。您可能需要阅读Why does django ORM's save method not return the saved object? 以进一步了解。

在您的情况下,您可以使用 Django's create 函数创建并获取返回的对象:

visitor = Visitor.objects.create(visitor_name=visitor_name)
visit_request = VisitRequests.objects.create(staff=staff, visitor=visitor, comment=comment, token=token, status=None)

【讨论】:

  • @B.obed 如果这个答案有帮助,请选择这个答案
猜你喜欢
  • 2015-04-22
  • 2018-08-24
  • 2022-01-19
  • 2021-11-16
  • 2020-12-18
  • 2021-03-20
  • 2020-02-11
  • 2019-02-13
  • 2017-12-31
相关资源
最近更新 更多