Điều quan trọng là để giải quyết này ở cấp độ mô hình, chứ không phải ở cấp hình thức, vì dữ liệu có thể nhập thông qua các API, thông qua các kịch bản nhập, từ trình bao, vv Nhược điểm của thiết lập null=True
trên CharField là cột có thể kết thúc với cả chuỗi trống và NULL, hơi mơ hồ nhưng không phải là vấn đề trong kinh nghiệm của tôi. Nếu bạn sẵn sàng sống với sự mơ hồ đó, dưới đây là cách thực hiện theo một vài bước sau:
1) Đặt null=True, blank=True
trên trường và di chuyển trong thay đổi.
2) Massage dữ liệu của bạn để tất cả các chuỗi sản phẩm nào hiện có được thay đổi để NULLs:
items = Foo.objects.all()
for item in items:
if not item.somefield:
item.somefield = None
item.save()
3) Thêm một phương pháp tùy chỉnh save()
để mô hình của bạn:
def save(self, *args, **kwargs):
# Empty strings are not unique, but we can save multiple NULLs
if not self.somefield:
self.somefield = None
super().save(*args, **kwargs) # Python3-style super()
4) Đặt unique=True
trên lĩnh vực này và di chuyển trong đó.
Bây giờ bạn sẽ có thể lưu trữ somefield
làm trống hoặc dưới dạng giá trị duy nhất cho dù bạn đang sử dụng quản trị viên hay bất kỳ phương thức nhập dữ liệu nào khác.
Nếu bạn không muốn có một vài di cư, đây là một ví dụ về làm thế nào để làm điều đó trong một sự chuyển đổi duy nhất:
from __future__ import unicode_literals
from django.db import migrations, models
def set_nulls(apps, schema_editor):
Event = apps.get_model("events", "Event")
events = Event.objects.all()
for e in events:
if not e.wdid:
e.wdid = None
e.save()
class Migration(migrations.Migration):
dependencies = [
('events', '0008_something'),
]
operations = [
migrations.AlterField(
model_name='event',
name='wdid',
field=models.CharField(blank=True, max_length=32, null=True),
),
migrations.RunPython(set_nulls),
migrations.AlterField(
model_name='event',
name='wdid',
field=models.CharField(blank=True, max_length=32, null=True, unique=True),
),
]
Tôi đã xóa trường Twitter_id và sau đó thêm lại bằng cách sử dụng miền Nam.Nó hoạt động tốt ngay bây giờ mà không cho tôi bất kỳ vấn đề nào – noahandthewhale
Django đang xử lý một trường trống làm chuỗi trống '''', và 'unique = True' không cho phép nhiều mục có giá trị' '' '. Tuy nhiên nó sẽ cho phép nhiều mục nhập với 'twitter_id = None'. – Alasdair