Django:認証ユーザーをモデルにインポートする


83

問題が1つあります。Djangoで、新しいモデルを作成しました。

from django.db import models
from django.contrib.auth import user

class Workers(models.Model):
    user = models.OneToOneField(User, primary_key=True)
        work_group = models.CharField(max_length=20)
        card_num = models.IntegerField()
    def __unicode__(self):
            return self.user

しかし、それは機能しません: ImportError: cannot import name user

それを修正する方法は?

そこで、dbにOneToOneテーブル「auth_user」と関係のある新しいテーブル「workers」を作成したいと思います。ありがとう。

回答:


193
from django.contrib.auth.models import User

モデルを見逃しました-そしてユーザーは大文字になります。

カスタムユーザーモデルを使用する場合は、次のものを使用する必要があります。

from django.contrib.auth import get_user_model
User = get_user_model()

詳細については、ドキュメントをご覧ください。

Django 1.11で変更されました:

インポート時にget_user_model()を呼び出す機能が追加されました。


どうもありがとうございましたが、djangoのドキュメントでは、モデルdocs.djangoproject.com/en/dev/ref/contrib/authところではノーと書かれています。ところで、ありがとうございました。
BlaShadow 2013年

73

カスタムユーザーモデルを使用している場合は、次の手順を実行して参照します。

from django.contrib.auth import get_user_model
User = get_user_model()

または、外部キーまたは多対多の関係で使用する場合:

from django.conf import settings
....
user = models.ForeignKey(settings.AUTH_USER_MODEL)

ドキュメント


6
移植性が高いため、これは受け入れられた回答よりも正確です。
2015年

3

AUTH_USER_MODEL良い解決策です。これが質問による完全な解決策です。

from django.db import models
from django.conf import settings

class Workers(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL)
    work_group = models.CharField(max_length=20)
    card_num = models.IntegerField()

    def __unicode__(self):
        return self.user.id

1

コードを汎用的に保つために、get_user_model()メソッドを使用してユーザーモデルとAUTH_USER_MODELには、authユーザーモデルを直接参照するのではなくモデルの関係を定義するときにそれを参照する設定。

ref:Django By Example Book

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.