13

オブジェクト マネージャのcreate()メソッドの疑わしい動作に遭遇しました。このメソッドを使用する場合、オブジェクトの作成にフィールドは必要ないUserようです。結果は blank で得られます。メソッドを使用し、指定しない場合、使用できないパスワードで作成されます ( ~ まで)。passwordUserUserpasswordcreate_userpasswordUserset_unusable_password()

なしでユーザーを作成しようとすると、create()メソッドが作成されない理由がわかりません-ドキュメントでは、このフィールドが必須であると指定されています。メソッド/ドキュメントに何か問題がありますか?raise exceptionpasswordcreate()

4

2 に答える 2

19

これがまさに、ユーザー モデルに、ユーザーUserManager.create_user()を作成するためのメソッドを備えたカスタム マネージャーがある理由です。インスタンスでQuerySet.create()メソッドを使用する場合、次の 2 つの問題があります。User

  1. 管理コマンドを実行する場合は、スキーマpython manage.py sqlに注意してください。auth_user

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

    SQL では、空の文字列 ,は、つまり''と同等ではありません。NULLISNULL('') != TRUE

  2. QuerySet.create()モデルの検証をトリガーしQuerySet.update() ません。モデルの検証は、インスタンスがインスタンス メソッドModelFormを呼び出したときにのみ発生します。Model.full_clean()

    API を直接操作するコンテキストで検証エラーを発生さQuerySetせることは、Django ではまったく意味がありません。そのため、空白の文字列に対して aが発生する場合User.objects.create(username='foo', password='')でも、次のようなことができます。CharField().validate(value='', None)ValidationError

上記の理由により、モデルのカスタム マネージャーからUser.objects.create()提供されたメソッドの使用を延期し、それに依存する必要があります。User.objects.create_user()

于 2012-07-18T15:43:42.150 に答える
1

django のソース ユーザー モデルを見てください。カスタム マネージャーのスニペットがあります。

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
于 2012-07-18T15:24:38.203 に答える