2016-02-05 30 views
3

我卡住與models.DateField()我無法解決Django 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」。

我應該如何改變這種代碼? 謝謝。

///額外/// 如果可以,我不想插入日期INTO生日領域。但似乎我不得不這樣做。我可以讓它空白?

birthdate = models.DateField(null=True, blank=False) 

沒有工作。

的Python 3.5.1 Django的1.9.1

+0

'blank = False'表示該字段不能爲空。你可以將它改爲'blank = True'並重試? –

+0

謝謝你的回覆。我做了birthdate = models.DateField(null = True,空白= True),我又得到了ValidationError。我做了birthdate = models.DateField(null = True,空白= True)和終端說「1)現在提供一次性默認值(將在所有現有行上設置) 2)現在忽略,讓我用NULL處理現有的行(例如,因爲您添加了RunPython或RunSQL操作來處理先前數據遷移中的NULL值) 3)退出,讓我在models.py中添加一個默認值「 – yamachan

+1

好吧,如果在執行'null = True時提示您進行選擇,blank = True',不是你想要的第二個選項(把字段留空)?另外,我覺得你的遷移可能會因爲你試圖遷移很多次而混亂,你應該刪除負責這個的遷移文件並重新生成 –

回答

2

聽起來像是你的遷移文件都搞砸了。當你進行遷移時,django會創建一個遷移文件來記錄你所做的事情。簡而言之,您多次更改了模型代碼,但是您從未更改過遷移文件,或者您正在創建重複的遷移文件。

下面列出的是你想要什麼,

birthdate = models.DateField(null=True, blank=True) 

但你注意到了,清理的是與此相關的變化,並創建一個新的應該解決這個問題的所有遷移文件。

+0

這次我瞭解了遷移文件。我之前使用過舊的Django,所以它給了我一個研究遷移的機會。並感謝你多次給我建議。 – yamachan

1

您已經嘗試了什麼應該工作:

birthdate = models.DateField(null=True, blank=False) 

這允許數據庫接受空值(在遷移過程中,它不會),空白意味着Django會不會從形式接受空值。

確保刪除已經創建但未應用的遷移。也請嘗試刪除項目中的所有.pyc文件。

+0

非常感謝,kneison。$ rm -rf migrations && mkdir migrations後,它的工作。謝謝。 – yamachan

1

試試這個,

birthdate = models.DateField(null=True, blank=False) 
+1

謝謝你的回覆,Savad。那些工作。最後我可以解決這個。我很感謝你。 – yamachan

+0

這就是不去上班。如果添加括號,則在首次實例化模型時調用該函數,並且django會在第一次調用該模型時重用該值。該值只會在您重新啓動django服務器時更新。所以如果你明天創建一個對象,那麼出生日期仍然是今天。 –

+0

但是,如果您在不帶圓括號的情況下傳遞'date.today',那麼您傳遞的是一個函數對象而不是調用它,所以每次創建一個新用戶時,都會在運行時調用該函數,這將保證獲得當前的'today ()'返回值,這應該是正確的做法。 –