2012-07-18 12 views
5

he encontrado con algún comportamiento sospechoso de create() método de User administrador de objetos. Parece que el campo password no es necesario para crear el objeto User si utiliza este método. En resultado obtienes User con password en blanco. En caso de que cuando se utiliza create_user método y no especifica password crea User con contraseña inutilizable (a través de set_unusable_password()).métodos Administrador de usuarios crean() y create_user()

No estoy seguro de por qué create() método no raise exception cuando intenta crear usuario sin password - en la documentación se especifica que este campo es obligatorio. ¿Hay algún problema en el método 0 documentación de create()?

Respuesta

9

eso es exactamente por qué el modelo de usuario tiene un gestor personalizado con un método para la creación de UserManager.create_user() usuarios. Hay dos problemas con el uso del método QuerySet.create() en User casos:

  1. Si ejecuta el comando gestión python manage.py sql, prestar atención al esquema auth_user:

    CREATE TABLE "auth_user" (
        ... 
        "password" varchar(128) NOT NULL, 
        ... 
    ) 
    

    En SQL, una cadena vacía, '' , no equivale a NULL, es decir, ISNULL('') != TRUE.

  2. QuerySet.create() y QuerySet.update()no activan la validación de modelos. La validación del modelo solo ocurre cuando las instancias ModelForm llaman al método de instancia Model.full_clean().

    Criar a un error de validación en el contexto del trabajo con la API directamente QuerySet simplemente no tiene sentido en Django. Es por eso que usted puede hacer algo como User.objects.create(username='foo', password='') a pesar de que CharField().validate(value='', None) elevaría un ValidationError para una cadena en blanco.

Por las razones anteriores, se debe aplazar el uso de User.objects.create() y se basan en el método de User.objects.create_user() suministrado desde el administrador de encargo del modelo.

+0

buena respuesta extendida :-) –

0

Mira modelo de usuario de la fuente de Django, hay un gestor de costumbre, fragmento:

class UserManager(models.Manager): 
    # ... 
    def create_user(self, username, email=None, password=None): 
     """ 
     Creates and saves a User with the given username, email and password. 
     """ 
     now = timezone.now() 
     if not username: 
      raise ValueError('The given username must be set') 
     email = UserManager.normalize_email(email) 
     user = self.model(username=username, email=email, 
          is_staff=False, is_active=True, is_superuser=False, 
          last_login=now, date_joined=now) 

     user.set_password(password) 
     user.save(using=self._db) 
     return user 
+1

entiendo que no se requiere contraseña para create_user. Se ha implementado si se autentica contra alguna fuente externa. Solo pienso que no es un comportamiento apropiado para el método create() del administrador del usuario. – sunprophit

+1

No, porque usuario tiene un gestor personalizado definido, pero utiliza los mismos 'objetos' variables crean –

Cuestiones relacionadas