Почему auth.User не проверил обязательные поля? - PullRequest
2 голосов
/ 11 декабря 2011

Я бы хотел расширить auth django. После прочтения этого вопроса
, это мой models.py:

from django.db import models
from django.contrib.auth.models import User
from django.db.models.signals import post_save  

class UserProfile(models.Model):
    user = models.OneToOneField(User)
    age = models.SmallIntegerField()  

def create_user_profile(sender, instance, created, **kwargs):  
    if created:  
        profile, created = UserProfile.objects.get_or_create(user=instance)    

post_save.connect(create_user_profile, sender=User) 

, и я добавляю эту строку вв нижней части моего settings.py:

AUTH_PROFILE_MODULE = 'MYAPP.UserProfile'  

Проблема в том, что, когда я запускаю python manage.py shell, введите:

from django.contrib.auth.models import User  
user = User()  

Это работает без проблем!почему не выдает ошибку, которую я не дал username/password?

Ответы [ 3 ]

6 голосов
/ 11 декабря 2011

Когда вы запускаете user = User(), все, что вы делаете, это создаете новый пользовательский экземпляр.Она не выдаст ошибку, пока вы не попытаетесь сохранить ее с помощью user.save().

. Для одновременного создания и сохранения нового экземпляра модели в БД:

user = User.objects.create() # should throw an IntegrityError due to required (not NULL) fields not provided
0 голосов
/ 11 декабря 2011

Ограничения в основном предназначены для проверки формы;существует очень мало ограничений (в основном тех, которые могут вызвать проблемы с БД), которые применяются при использовании 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):

  1. unique
  2. max_length
  3. null (не путайте с blank)
0 голосов
/ 11 декабря 2011

Убедитесь, что UserProfile находится внутри файла models.py в MYAPP, а MYAPP зарегистрирован в INSTALLED_APPS.Похоже, ваш сигнал вообще не работает.Если это не поможет, попробуйте это в оболочке:

from django.contrib.auth.models import User  
from MYAPP.models import UserProfile  
user = User() 

Таким образом, вы будете уверены, что сигнал был правильно зарегистрирован.

...