Django MySQL IntegrityError:(“字段'created_at'没有默认值”)

yyhrrdl8  于 2023-06-25  发布在  Go
关注(0)|答案(3)|浏览(102)

我是Django的新手。

IntegrityError: (1364, "Field 'created_at' doesn't have a default value")

当我没有为我在models.py中定义的模型编写created_at时,就会发生这种情况。
每次我面对这样的错误,我都会加上一句
created_at = models.DateTimeField(default=timezone.now, null=True)
到models.py,然后运行python manage.py makemigrations; python manage.py migrate --fake
可以吗?(我的意思是,它是否遵循Django最佳实践?当我使用Rails的时候,我从来没有遇到过这样的问题。为什么Django不自动处理created_at列?
另外,我想知道为什么--fake选项会删除此错误。

版本

Django==1.11.5 
mysqlclient==1.3.12                                                                                                                                                                                                
Python 3.6.1

先谢谢你了。

dgiusagp

dgiusagp1#

似乎您希望在每次创建模型示例时设置一个属性created_at。有一个更简单的方法:

created_at = models.DateTimeField(auto_now_add=True)

这里有详细解释的文档https://docs.djangoproject.com/en/1.11/ref/models/fields/#django.db.models.DateField.auto_now_add

new9mtju

new9mtju2#

从你的评论中,我想我可以复制你的步骤。在models.py中有一个模型类:

from django.db import models

class YourModel(models.Model):
    one_field = models.CharField()
    another_field = models.CharField()

然后你跑了:

python manage.py makemigrations
python manage.py migrate

之后,你添加到你的模型类:

from django.db import models

class YourModel(models.Model):
    one_field = models.CharField()
    another_field = models.CharField()
    created_at = models.DateTimeField(default=timezone.now, null=True)

但忘记运行迁移并收到错误消息。
这是因为Django ORM正在寻找属性created_at,它在数据库中找不到。你必须运行命令:

python manage.py makemigrations
python manage.py migrate

请记住,选项--fake不会更改DB。它只是将迁移标记为运行。只有当你确定你在做什么的时候才使用它。
正如Johannes Reichard建议的那样,您最好使用auto_now_add(还有auto_now)来实现此目的。查看官方文档。
缺点是此字段不会显示在管理中。解决方法是覆盖save方法:

def save(self, *args, **kwargs):
    if not self.pk:
        self.created_at = timezone.now() # import it from django.utils
    super(YourModel, self).save(*args, **kwargs)
yrefmtwq

yrefmtwq3#

我也遇到过类似的问题,我的数据库状态与存储库不同步(可能是从另一个存储库分支迁移而来的一些剩余字段留在了数据库中)。
看到这个错误我就抓狂了:
IntegrityError: (1364, "Field 'open' doesn't have a default value")
当我没有字段open在我的模型。
请确保检查您的DB模式并查找表定义,然后将其与Django模型定义进行比较。

相关问题