我无法解决Django模型中的models.DateField ValidationError。

3
我被 models.DateField() 中的一个错误困住了。
首先,我做了这个。
models.py
from datetime import date, datetime
from django.db import models

class User(models.Model):
    uid = models.AutoField(primary_key=True)
    birthdate = models.DateField()

然后,我得到了,
$ python manage.py makemigrations
You are trying to add a non-nullable field 'birthdate' to user_profile without a default; we can't do that (the database needs something to populate existing rows).
Please select a fix:
 1) Provide a one-off default now (will be set on all existing rows)
 2) Quit, and let me add a default in models.py

所以,我做了,
models.py
from datetime import date, datetime
from django.db import models

class User(models.Model):
    uid = models.AutoField(primary_key=True)
    birthdate = models.DateField(default=date.today)

然后,
$ python manage.py migrate
django.core.exceptions.ValidationError: ["'' は無効な日付形式です。YYYY-MM-DD形式にしなければなりません。"]

这个错误的意思是“''不是一个有效的日期格式。你需要改成YYYY-MM-DD”。
那我应该如何修改这段代码呢? 谢谢。
另外,如果可以的话,我不想把日期插入到birthdate字段中。但好像我必须得插入。我能让它保持空白吗?
birthdate = models.DateField(null=True, blank=False)

未能工作。
Python 3.5.1 Django 1.9.1

blank=False 表示该字段不能为空。您可以将其更改为 blank=True,然后重试吗? - Shang Wang
谢谢您的回复Shang。我使用了birthdate = models.DateField(null=True, blank=True),但是我仍然得到了ValidationError。终端提示我:“1)现在提供一次性默认值(将设置在所有现有行上) 2)现在忽略,让我自己处理具有NULL的现有行(例如,因为您添加了RunPython或RunSQL操作来处理以前数据迁移中的NULL值) 3)退出,并让我在models.py中添加默认值”。 - yamachan
1
如果你在使用 null=True, blank=True 时有选择的提示,那么第二个选项难道不是你想要的(将字段保留为空)吗?此外,我感觉你的迁移可能出了问题,因为你尝试了多次迁移。你应该删除负责此操作的迁移文件并重新生成。 - Shang Wang
非常感谢。我不知道迁移文件的存在。在我删除了/migrations目录下的文件之后,它就可以工作了。这花费了我5个小时,所以我非常感激你。 - yamachan
3个回答

2
听起来你的迁移文件出了问题。当你进行迁移时,Django会创建一个记录你所做操作的迁移文件。简而言之,你已经多次更改了模型代码,但从未更改过迁移文件,或者你正在创建重复的迁移文件。
以下应该是你想要的内容:
birthdate = models.DateField(null=True, blank=True)

但是,正如你所注意到的那样,清理与此更改相关的所有迁移文件并创建一个新的迁移文件应该解决问题。


这次我学到了关于迁移文件的知识。之前我使用的是旧版Django,所以这给了我学习迁移的机会。非常感谢你多次给予我建议。 - yamachan

1
你尝试的应该可以工作:
birthdate = models.DateField(null=True, blank=False)

这使得数据库可以接受空值(在迁移期间会这样做),而空白意味着Django不会从表单中接受空值。
请确保删除已创建但未应用的迁移。还尝试删除项目中的所有.pyc文件。

非常感谢你,kneison。执行 $ rm -rf migrations && mkdir migrations 命令后,它正常工作了。谢谢。 - yamachan

1
尝试一下这个,
birthdate = models.DateField(null=True, blank=False)

1
谢谢您的回复,Savad。它们起作用了。最终我解决了这个问题。我很感激你。 - yamachan
那样行不通。如果你加上括号,你会在实例化model的第一次调用函数时就调用它,django会重复使用第一次调用的值。只有在重新启动django服务器时,该值才会更新。因此,如果你明天创建一个对象,出生日期仍然是今天。 - Shang Wang
抱歉,我还不熟悉这个网站。我点击了△。啊,我需要点击✔。 - yamachan
https://dev59.com/JHE85IYBdhLWcg3wdDIM - Shang Wang
啊,是的。我一定写了models.DateField(default=date.today)。 - yamachan
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接