Ограничения в основном предназначены для проверки формы;существует очень мало ограничений (в основном тех, которые могут вызвать проблемы с БД), которые применяются при использовании API.
Вы можете легко создать пустого пользователя (пользователя без имени пользователя):
>>> from django.contrib.auth.models import User
>>> u = User()
>>> u.save()
>>> u
<User: >
>>> u.id
2
Однако, если вы попытаетесь создать двух пустых пользователей, вы получите IntegrityError
:
>>> u = User()
>>> u.save()
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "/Users/burhan/work/projects/foo/env/lib/python2.7/site-packages/django/db/models/base.py", line 460, in save
self.save_base(using=using, force_insert=force_insert, force_update=force_update)
File "/Users/burhan/work/projects/foo/env/lib/python2.7/site-packages/django/db/models/base.py", line 553, in save_base
result = manager._insert(values, return_id=update_pk, using=using)
File "/Users/burhan/work/projects/foo/env/lib/python2.7/site-packages/django/db/models/manager.py", line 195, in _insert
return insert_query(self.model, values, **kwargs)
File "/Users/burhan/work/projects/foo/env/lib/python2.7/site-packages/django/db/models/query.py", line 1436, in insert_query
return query.get_compiler(using=using).execute_sql(return_id)
File "/Users/burhan/work/projects/foo/env/lib/python2.7/site-packages/django/db/models/sql/compiler.py", line 791, in execute_sql
cursor = super(SQLInsertCompiler, self).execute_sql(None)
File "/Users/burhan/work/projects/foo/env/lib/python2.7/site-packages/django/db/models/sql/compiler.py", line 735, in execute_sql
cursor.execute(sql, params)
File "/Users/burhan/work/projects/foo/env/lib/python2.7/site-packages/django/db/backends/util.py", line 34, in execute
return self.cursor.execute(sql, params)
File "/Users/burhan/work/projects/foo/env/lib/python2.7/site-packages/django/db/backends/sqlite3/base.py", line 234, in execute
return Database.Cursor.execute(self, query, params)
IntegrityError: column username is not unique
Если вы посмотрите на модель, вы увидите, что естьограничение уровня базы данных в поле username
(unique=True
):
`username = models.CharField(_('username'), max_length=30, unique=True...`
Это применяется на уровне API, поэтому у вас не может быть двух пользователей с одним и тем же полем username
.
Другим примером этого является аргумент выбора.Это используется в основном для презентации.Если у вас есть поле с choices=('M','Male'),('F','Female')
;С помощью API вы можете вставить любой отдельный символ, и он с радостью примет его.
Параметры, которые применяются на уровне базы данных (то есть вы не можете "нарушать" их из API):
unique
max_length
null
(не путайте с blank
)