33

私はジャンゴを使用してい'1.5c1'ます。settings.py に次の行があります。

AUTH_USER_MODEL = 'fileupload.galaxyuser'

これが私のGalaxyuserモデルです:

class GalaxyUser(models.Model):
    id = models.IntegerField(primary_key=True)
    create_time = models.DateTimeField(null=True, blank=True)
    update_time = models.DateTimeField(null=True, blank=True)
    email = models.CharField(max_length=765)
    password = models.CharField(max_length=120)
    external = models.IntegerField(null=True, blank=True)
    deleted = models.IntegerField(null=True, blank=True)
    purged = models.IntegerField(null=True, blank=True)
    username = models.CharField(max_length=765, blank=True)
    form_values_id = models.IntegerField(null=True, blank=True)
    disk_usage = models.DecimalField(null=True, max_digits=16, decimal_places=0, blank=True)
    class Meta:
        db_table = u'galaxy_user'

Galaxyuserモデルから認証したい。ただし、ログインすると、次のエラーが発生します。

AttributeError: 'Manager' object has no attribute 'get_by_natural_key'

私は何を間違っていますか?

編集: Traceback:

Traceback:
File "/usr/local/lib/python2.6/dist-packages/django/core/handlers/base.py" in get_response
  115.                         response = callback(request, *callback_args, **callback_kwargs)
File "/home/zurelsoft/workspace/genalytics/fileupload/backend.py" in login_backend
  26.         user = authenticate(username=username, password=password)
File "/usr/local/lib/python2.6/dist-packages/django/contrib/auth/__init__.py" in authenticate
  59.             user = backend.authenticate(**credentials)
File "/usr/local/lib/python2.6/dist-packages/django/contrib/auth/backends.py" in authenticate
  16.             user = UserModel.objects.get_by_natural_key(username)

Exception Type: AttributeError at /login_backend/
Exception Value: 'Manager' object has no attribute 'get_by_natural_key'
4

2 に答える 2

59

新しいユーザー モデルを作成しましたが、そのモデルのマネージャーをまだ指定していません。Django のマネージャーにまだ慣れていない場合は、最初にそのドキュメントを読むことをお勧めします。Django 1.5が言うように(source):

User モデルのカスタム マネージャーも定義する必要があります。User モデルが Django のデフォルトの User と同じようにユーザー名と電子メール フィールドを定義する場合、Django の UserManager をインストールするだけで済みます。ただし、User モデルが異なるフィールドを定義する場合は、BaseUserManager を拡張して 2 つの追加メソッドを提供するカスタム マネージャーを定義する必要があります:create_user()create_superuser().

つまり、モデルが Django のUserモデルと同じユーザー名と電子メール フィールドを使用する場合、次のように記述できます。

from django.contrib.auth.models import UserManager

class GalaxyUser(models.Model):
    id = models.IntegerField(primary_key=True)
    create_time = models.DateTimeField(null=True, blank=True)
    update_time = models.DateTimeField(null=True, blank=True)
    email = models.CharField(max_length=765)
    password = models.CharField(max_length=120)
    external = models.IntegerField(null=True, blank=True)
    deleted = models.IntegerField(null=True, blank=True)
    purged = models.IntegerField(null=True, blank=True)
    username = models.CharField(max_length=765, blank=True)
    form_values_id = models.IntegerField(null=True, blank=True)
    disk_usage = models.DecimalField(null=True, max_digits=16, decimal_places=0, blank=True)

    objects = UserManager()

    class Meta:
        db_table = u'galaxy_user'

または、必要なメソッドをサブクラス化してBaseUserManager(これも でdjango.contrib.auth.models) 実装する必要があります。objects次に、それをモデルの変数に割り当てる必要があります。

于 2013-02-06T08:44:10.027 に答える
-1

UserMangerクラスのクラスがある場合は、GalaxyUser必ずそれに追加objects = UserManager()してください

于 2021-11-19T19:20:03.440 に答える