मेरे पास मॉडल फू है जिसमें फील्ड बार है। बार क्षेत्र अद्वितीय होना चाहिए, लेकिन इसमें नल की अनुमति दें, जिसका अर्थ है कि मैं एक से अधिक रिकॉर्ड की अनुमति देना चाहता हूं यदि बार क्षेत्र है null
, लेकिन अगर यह null
मान नहीं है तो अद्वितीय होना चाहिए।
यहाँ मेरा मॉडल है:
class Foo(models.Model):
name = models.CharField(max_length=40)
bar = models.CharField(max_length=40, unique=True, blank=True, null=True, default=None)
और यहाँ तालिका के लिए इसी एसक्यूएल है:
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)
)
व्यवस्थापक इंटरफ़ेस का उपयोग करते समय 1 से अधिक फू ऑब्जेक्ट्स बनाने के लिए जहां बार नल है, यह मुझे एक त्रुटि देता है: "इस बार के साथ फू मौजूद है।"
हालाँकि जब मैं डेटाबेस (PostgreSQL) में सम्मिलित करता हूँ:
insert into appl_foo ("name", bar) values ('test1', null)
insert into appl_foo ("name", bar) values ('test2', null)
यह काम करता है, बस ठीक है, यह मुझे 1 से अधिक रिकॉर्ड डालने की अनुमति देता है बार के साथ शून्य, इसलिए डेटाबेस मुझे वह करने की अनुमति देता है जो मैं चाहता हूं, यह सिर्फ Django मॉडल के साथ कुछ गलत है। कोई विचार?
संपादित करें
जहां तक डीबी के समाधान की पोर्टेबिलिटी नहीं है, हम पोस्टग्रैज से खुश हैं। मैंने एक कॉल करने योग्य के लिए अद्वितीय स्थापित करने का प्रयास किया है, जो कि बार के विशिष्ट मूल्यों के लिए ट्रू / फाल्स लौटाने का मेरा कार्य था , इसने कोई त्रुटि नहीं दी, हालांकि इस तरह से कोई प्रभाव नहीं पड़ा।
अब तक, मैंने बार प्रॉपर्टी से अद्वितीय स्पेसियर हटा दिया है और एप्लिकेशन में बार विशिष्टता को संभाल रहा है , हालांकि अभी भी अधिक सुरुचिपूर्ण समाधान की तलाश में है। कोई सिफारिशें?
def get_db_prep_value(self, value, connection, prepared=False)
विधि कॉल की आवश्यकता होगी । अधिक informations के लिए group.google.com/d/msg/django-users/Z_AXgg2GCqs/zKEsfu33OZMJ चेक करें । निम्नलिखित विधि मेरे लिए भी काम करती है,: get get_prep_value (स्वयं, मान): if value == "": #if Django '' string को बचाने की कोशिश करता है, db कोई नहीं भेजता (NULL) कोई और नहीं लौटाता: वापसी मान # सही, बस मान पास करें