from django.db import models
from datetime import datetime
from django.contrib.auth import get_user_model
User = get_user_model()
class Blog(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
headline = models.CharField(max_length=250)
content = models.CharField(max_length=2050)
time_created = models.DateTimeField(default=datetime.now, blank=True)
def __str__(self):
return self.user.username
每次我遷移這個
"(venv) PS C:\Users\user\Desktop\APPS\web_app_project> python manage.py makemigrations"
我總是收到這樣的資訊:
“如果不指定默認值,就不可能向博客添加不可為空的欄位‘用戶’。這是因為資料庫需要一些東西來填充現有的行。請選擇一個修復:
- 現在提供一次性默認值(將在所有現有行上設定此列的空值)
- 退出并在 models.py 中手動定義一個默認值。
選擇一個選項:”
我該怎么做
uj5u.com熱心網友回復:
user因為您已經向Django添加了不可為空的欄位,所以Blog需要將用戶添加到資料庫中的所有博客實體,包括新的和現有的。如果你在資料庫中創建了一個博客實體,Django 應該如何處理它的新用戶列?這就是它要問你的。
只有當資料庫中沒有資料或者您完全可以丟失資料時,您才能將您的應用程式遷移到零python manage.py migrate <your app name> zero(您可能還想反向遷移zero。您可以閱讀有關反向遷移的更多資訊)。這將有效地撤消該應用程式的所有遷移。然后,您可以洗掉該應用程式的現有遷移并makemigrations再次運行。Django 將不再抱怨不可為空的欄位user,因為這會導致創建帶有Blog用戶欄位的表的遷移,而不是嘗試將user欄位添加到現有 Blog表的遷移。再一次,除非您同意丟失資料,否則不要這樣做。如果您的應用程式已經在生產環境中運行,則永遠不應該這樣做,但如果您從未部署過應用程式并且沒有“真實”資料,并且您仍處于初始開發階段,那么也可以。此外,請確保您有已洗掉遷移的備份,以防您需要重新添加它們。
正如其他人所建議的那樣,您可以創建一個默認用戶模型,用作一次性默認添加users 到Blogs. 例如(在 Django 外殼中)
from django.contrib.auth import get_user_model
User = get_user_model()
user = User(username='default_blog_user')
user.set_unusable_password() # Nobody should be able to log in as this user
user.save()
print(user.id) # keep this ID
然后,在遷移中,您可以使用該user.id值作為一次性默認值。但這再次假設您尚未部署到生產環境,因為一次性默認值和開發和生產中的 ID 可能不匹配。
如果您已經部署到生產環境,我認為您唯一能做的就是為了遷移而使用戶欄位為空,但在您的編程邏輯中斷言它不是空的。例如,通過向欄位添加驗證器。
旁注:而不是get_user_model在你的models模塊中運行,你應該這樣做:
from django.conf import settings
class Blog(models.Model):
user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
# etc.
當您為用戶模型定義外鍵或多對多關系時,您應該使用 AUTH_USER_MODEL 設定指定自定義模型。
來源
uj5u.com熱心網友回復:
您可以通過使用然后匯入所需的模型來手動添加python shell用戶python manage.py shell。
在此處閱讀類似問題的更多資訊:
如何使用python 外殼
https://stackoverflow.com/a/5150535/15383032
uj5u.com熱心網友回復:
也許將 UUID 添加到您的用戶模型中,并使其他模型中需要用戶的欄位成為存盤用戶 UUID 的 CharField。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/478780.html
