【问题标题】:created NULL constraint failed Django 2.2.1创建 NULL 约束失败 Django 2.2.1
【发布时间】:2019-05-27 14:30:55
【问题描述】:

所以,首先,没有待处理的迁移。

我明白了:

[...]
  File "C:\Program Files\Python37\lib\site-packages\django\db\backends\sqlite3\base.py", line 383, in execute
    return Database.Cursor.execute(self, query, params)
django.db.utils.IntegrityError: NOT NULL constraint failed: backup_basenode.created

在这一行:

        node = Node(id=old_node.id, name=clean["name"], customer=customer)
        node.save()

相关型号:

class BaseNode(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    created = models.DateTimeField(auto_now_add=True)
    modified = models.DateTimeField(auto_now=True)
    def __str__(self):
        return f"{str(self.id)}"

class Node(BaseNode):
    customer = models.ForeignKey(Customer, on_delete=models.CASCADE)
    name = models.CharField(max_length=200)
    def __str__(self):
        return f"{self.name}({self.customer})"

据我所知,创建的字段应该是自动填充的,因此不应该为空?

至于预期的行为,我正在尝试将 BaseNode 提升为 Node,因为我还没有找到直接的方法,所以我创建了一个新的 Node 实例并删除了 BaseNode 实例。

【问题讨论】:

  • 不确定到底发生了什么,但如果old_node 仍然存在于数据库中,创建具有相同idNode 将在保存时更新现有old_node,而不是创建新的目的。似乎 django 不认为这是创建(即它不会设置created),但由于您的node 实例没有设置created,它会尝试在此处保存NULL。你应该先删除old_node
  • 我现在将旧节点的删除移到了创建之上,现在它默默地失败了。对这个比较困惑。该函数执行,但既没有创建新节点,也没有删除旧节点。但是函数末尾的打印会打印出来。
  • 改用this(显然在保存之前添加namecustomer)。

标签: django django-models


【解决方案1】:

在创建“增强”实例之前删除旧实例就可以了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-13
    • 2019-06-01
    • 2020-03-28
    • 2020-12-19
    • 2016-04-02
    • 2017-11-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多