Tôi có mô hình Foo có thanh trường. Trường thanh phải là duy nhất, nhưng cho phép null trong đó, nghĩa là tôi muốn cho phép nhiều hơn một bản ghi nếu trường thanh là null
, nhưng nếu nó không phải là null
các giá trị phải là duy nhất.
Đây là mô hình của tôi:
class Foo(models.Model):
name = models.CharField(max_length=40)
bar = models.CharField(max_length=40, unique=True, blank=True, null=True, default=None)
Và đây là SQL tương ứng cho bảng:
CREATE TABLE appl_foo
(
id serial NOT NULL,
"name" character varying(40) NOT NULL,
bar character varying(40),
CONSTRAINT appl_foo_pkey PRIMARY KEY (id),
CONSTRAINT appl_foo_bar_key UNIQUE (bar)
)
Khi sử dụng giao diện quản trị để tạo nhiều hơn 1 đối tượng foo trong đó thanh là null, nó sẽ báo lỗi: "Foo với thanh này đã tồn tại."
Tuy nhiên khi tôi chèn vào cơ sở dữ liệu (PostgreSQL):
insert into appl_foo ("name", bar) values ('test1', null)
insert into appl_foo ("name", bar) values ('test2', null)
Điều này hoạt động tốt, nó cho phép tôi chèn hơn 1 bản ghi với thanh là null, vì vậy cơ sở dữ liệu cho phép tôi làm những gì tôi muốn, đó chỉ là một cái gì đó sai với mô hình Django. Có ý kiến gì không?
BIÊN TẬP
Tính di động của giải pháp đối với DB không phải là vấn đề, chúng tôi hài lòng với Postgres. Tôi đã thử cài đặt duy nhất cho một cuộc gọi, đó là chức năng của tôi trả về True / false cho các giá trị cụ thể của thanh , nó không đưa ra bất kỳ lỗi nào, tuy nhiên được xử lý như không có tác dụng gì cả.
Cho đến nay, tôi đã xóa trình xác định duy nhất khỏi thuộc tính thanh và xử lý tính duy nhất của thanh trong ứng dụng, tuy nhiên vẫn đang tìm kiếm một giải pháp thanh lịch hơn. Có khuyến nghị nào không?
def get_db_prep_value(self, value, connection, prepared=False)
gọi phương thức. Kiểm tra nhóm.google.com/d/msg/django-users/Z_AXgg2GCqs/zKEsfu33OZMJ để biết thêm thông tin. Phương thức sau cũng hoạt động với tôi: def get_prep_value (self, value): if value == "": #if Django cố lưu chuỗi '', gửi db Không (NULL) trả về Không ai khác: trả về giá trị #therwise, chỉ vượt qua giá trị