我在擴展的 UserProfile 模型上有以下現有 twitter 欄位,我想將欄位型別從 URLField 更改為 max_length 為 20 的 CharField。當我嘗試遷移更改時,我收到錯誤django.db.utils.DataError: value too long for type character varying(20)。我不關心該欄位中的現有資料,如果遷移時存在現有資料,我更喜歡它們變為空白。如何更改欄位型別并清除現有資料?
class UserProfile(models.Model):
user = models.OneToOneField(User, on_delete=models.SET_NULL, null=True)
# old field
twitter = models.URLField(verbose_name="Twitter", blank=True)
# new field
# twitter = models.CharField(
# max_length=20, verbose_name="Twitter Username", null=True, blank=True
# )
uj5u.com熱心網友回復:
方法一
為了更改欄位的型別和最大長度,該欄位應該知道資料庫中最長的 url 長度。如果您使用的是 sqlite3 資料庫,則在您的 db_shell 或 sqlite3 shell 或您擁有的任何東西中運行以下查詢。
SELECT MAX(LENGTH(column_name)) FROM table_name;
然后將新欄位的 max_length 設定為該值。
方法二
python manage.py shell
然后
# Import your model
profiles = UserProfile.objects.all()
max_length = 0
for userprofile in userprofiles:
if len(userprofile.twitter) > max_length:
max_length = len(userprofile.twitter)
print(max_length)
然后將您的 max_length 設定為從上述代碼列印的值。
uj5u.com熱心網友回復:
此錯誤意味著該列上有超過 20 個字符的值。
您需要跟蹤和更改它們。這會將它們更改為空字串。
UPDATE <table_name>
SET twitter = ""
WHERE LENGTH(twitter) > 20;
然后你可以運行你的遷移。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/454483.html
標籤:django
