【发布时间】: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仍然存在于数据库中,创建具有相同id的Node将在保存时更新现有old_node,而不是创建新的目的。似乎 django 不认为这是创建(即它不会设置created),但由于您的node实例没有设置created,它会尝试在此处保存NULL。你应该先删除old_node。 -
我现在将旧节点的删除移到了创建之上,现在它默默地失败了。对这个比较困惑。该函数执行,但既没有创建新节点,也没有删除旧节点。但是函数末尾的打印会打印出来。
-
改用this(显然在保存之前添加
name和customer)。
标签: django django-models