python - تميز null=True، blank=True in django
django-models (6)
أعتقد أنك قد تهتم بحفظ شارلفيلد الفارغة ، الفارغة كسلعة لا كسلسلة فارغة . هناك العديد من المناقشات حول هذا الموضوع ، ومشكلة عملية جدًا قد تواجهها (على سبيل المثال ، تريد إضافة عنوان url مفتوح لكل مستخدم يمكن أن يكون فارغًا ويجب أن يكون فريدًا).
عندما نضيف حقل قاعدة بيانات في django نكتب عادة models.CharField(max_length=100, null=True, blank=True)
. وينطبق الشيء نفسه مع ForeignKey
، DecimalField
إلخ. ما هو الفرق الأساسي في وجود
-
null=True
فقط -
blank=True
فقط -
null=True
،blank=True
فيما يتعلق CharField
( CharField
، ForeignKey
، ManyToManyField
، DateTimeField
) مختلفة. ما هي مزايا / عيوب استخدام 1/2/3؟
ببساطة null=True
يجب أن تقبل قاعدة البيانات قيم NULL
، من ناحية أخرى blank=True
يحدد عند التحقق من صحة النموذج يجب أن يقبل هذا الحقل قيمًا فارغة أو لا (إذا كانت blank=True
فإنها تقبل النموذج بدون قيمة في هذا الحقل و blank=False
[القيمة الافتراضية ] على التحقق من صحة النموذج سيظهر هذا الحقل خطأ مطلوب .
null=True/False
مرتبط بقاعدة البيانات
blank=True/False
ذات الصلة بالتحقق من صحة النموذج
عندما نقوم بحفظ أي شيء في Django admin ، يتم التحقق من خطوتين ، على مستوى Django وعلى مستوى قاعدة البيانات. لا يمكننا حفظ النص في حقل رقم.
قاعدة بيانات لديها نوع البيانات NULL ، لا شيء. عندما يقوم Django بإنشاء أعمدة في قاعدة البيانات ، فإنه يحدد أنه لا يمكن أن يكون فارغًا. وإذا حاولت حفظ NULL سوف تحصل على خطأ في قاعدة البيانات.
أيضا على مستوى Django-Admin ، جميع الحقول مطلوبة بشكل افتراضي ، لا يمكنك حفظ الحقل الفارغ ، سوف يرميك Django خطأ.
لذا ، إذا كنت تريد حفظ الحقل الفارغ تحتاج إلى السماح به على مستوى Django و Database. blank = True - سيسمح بالحقل الفارغ في لوحة الإدارة null = True - سيسمح بحفظ NULL في عمود قاعدة البيانات.
فيما يلي مثال على الحقل مع blank = true و null = true description = models.TextField (فارغ = True، null = True)
في هذه الحالة: فارغ = صواب: يخبر نموذجنا أنه لا بأس ترك حقل الوصف فارغًا
و
null = True: يخبرنا قاعدة البيانات الخاصة بنا أنه من الجيد تسجيل قيمة خالية في حقل db الخاص بنا وعدم إعطاء أي خطأ.
هذه هي الطريقة التي يحدد بها ORM الحقول null
واللاغية لـ Django 1.8
class Test(models.Model):
charNull = models.CharField(max_length=10, null=True)
charBlank = models.CharField(max_length=10, blank=True)
charNullBlank = models.CharField(max_length=10, null=True, blank=True)
intNull = models.IntegerField(null=True)
intBlank = models.IntegerField(blank=True)
intNullBlank = models.IntegerField(null=True, blank=True)
dateNull = models.DateTimeField(null=True)
dateBlank = models.DateTimeField(blank=True)
dateNullBlank = models.DateTimeField(null=True, blank=True)
حقول قاعدة البيانات التي تم إنشاؤها لـ PostgreSQL 9.4 هي:
CREATE TABLE Test (
id serial NOT NULL,
"charNull" character varying(10),
"charBlank" character varying(10) NOT NULL,
"charNullBlank" character varying(10),
"intNull" integer,
"intBlank" integer NOT NULL,
"intNullBlank" integer,
"dateNull" timestamp with time zone,
"dateBlank" timestamp with time zone NOT NULL,
"dateNullBlank" timestamp with time zone,
CONSTRAINT Test_pkey PRIMARY KEY (id)
)
حقول قاعدة البيانات التي تم إنشاؤها لـ MySQL 5.6 هي:
CREATE TABLE Test (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`charNull` VARCHAR(10) NULL DEFAULT NULL,
`charBlank` VARCHAR(10) NOT NULL,
`charNullBlank` VARCHAR(10) NULL DEFAULT NULL,
`intNull` INT(11) NULL DEFAULT NULL,
`intBlank` INT(11) NOT NULL,
`intNullBlank` INT(11) NULL DEFAULT NULL,
`dateNull` DATETIME NULL DEFAULT NULL,
`dateBlank` DATETIME NOT NULL,
`dateNullBlank` DATETIME NULL DEFAULT NULL
)
null
لقيمة عمود DataBase
null=True
تعيّن NULL
(مقابل NOT NULL
) على العمود في DB الخاص بك. سيتم تخزين القيم الفارغة لأنواع حقول Django مثل DateTimeField
أو ForeignKey
كـ NULL
في DB.
blank
للمتطلبات الميدانية في النماذج
blank=True
يحدد ما إذا كان الحقل مطلوبًا في النماذج. يتضمن هذا المسؤول والنماذج المخصصة الخاصة بك. إذا كانت blank=True
فلن يكون الحقل مطلوبًا ، بينما إذا كان False
لا يمكن أن يكون الحقل فارغًا.
يكون التحرير والسرد متكررًا جدًا لأنه عادةً إذا كنت ستسمح بالحقل ليكون فارغًا في النموذج الخاص بك ، فستحتاج أيضًا إلى قاعدة البيانات الخاصة بك للسماح بقيم NULL
لهذا الحقل. الاستثناء هو CharField
s و TextField
s ، والتي لا يتم حفظها في Django على أنها NULL
. يتم تخزين القيم الفارغة في DB كسلسلة فارغة ( ''
).
بعض الأمثلة:
models.DateTimeField(blank=True) # raises IntegrityError if blank
models.DateTimeField(null=True) # NULL allowed, but must be filled out in a form
من الواضح أن هذين الخيارين لا يجعلان من المنطقي استخدامهما (رغم ذلك ، قد تكون هناك حالة استخدام null=True, blank=False
إذا كنت تريد أن يكون الحقل مطلوبًا دائمًا في النماذج ، ولكن اختياريًا عند التعامل مع كائن ما من خلال شيء ما مثل القشرة.)
models.CharField(blank=True) # No problem, blank is stored as ''
models.CharField(null=True) # NULL allowed, but will never be set as NULL
لا يتم حفظ أنواع CHAR
و TEXT
أبدًا كـ NULL
by Django ، لذلك null=True
غير ضروري. ومع ذلك ، يمكنك يدوياً تعيين أحد هذه الحقول إلى بلا لفرض تعيينها كـ NULL
. إذا كان لديك سيناريو حيث قد يكون ذلك ضروريًا ، يجب أن لا تزال تتضمن null=True
.