3

次のように、いくつかの追加の権限が付加されたdjango認証ユーザープロキシモデルがあります。

class User(User):
    class Meta:
        proxy = True
        permissions = (
            ("write_messages","May add new messages to front page"),
            ("view_maps","Can view the maps section"),
        )

モデルの他の場所に、User を外部キーとして持つオブジェクトがあります。

class Project(models.Model):
    creation_date   = models.DateTimeField(auto_now_add=True)
    modify_date     = models.DateTimeField(auto_now=True)
    owner           = models.ForeignKey(User)

私のビューの1つで、現在のユーザーを所有者として使用して新しいプロジェクトを作成しようとしています

@login_required
def new_project(request):
    project = Project.objects.create(owner=request.user)

ただし、これはエラーを返します。

Cannot assign "<User: mwetter>": "Project.owner" must be a "User" instance.

プロジェクト オブジェクトの外部キーの所有者が、プロキシ クラスではなく、Django ユーザーの基本クラスを参照していると想定しています。プロキシ ユーザーを外部キーとして参照する方法はありますか?

4

3 に答える 3

20

@DavidRobinsonが言ったことに加えて、プロキシモデルへの外部キーの作成に注意する必要があります。プロキシモデルは、すべての目的と目的がモデルと同じであるにもかかわらず、プロキシモデルのサブクラスです。プロキシへの外部キーがある場合、基本クラスは受け入れられませんが、基本クラスへの外部キーはプロキシ受け入れます。たとえば、次のようにします。

与えられた:

class UserProxy(User):
    class Meta:
        proxy = True
    ...

class User(models.Model):
    ...

以下は例外を発生させます:

class SomeModel(models.Model):
    user = models.ForeignKey(UserProxy)

user = User.objects.get(username='some_user')
instance = SomeModel.objects.create(user=user)

ただし、以下は正常に機能します。

class SomeModel(models.Model):
    user = models.ForeignKey(User)

user = UserProxy.objects.get(username='some_user')
instance = SomeModel.objects.create(user=user)

これは、関係の方向性によるものです。UserProxy is-a ですUserが、でUserはありませんUserProxy

于 2012-05-08T19:12:49.807 に答える
1

Userと の間で混乱を招くことが保証されているプロキシ クラス を呼び出すのはなぜdjango.contrib.auth.models.Userですか? なぜUserProxy、またはMyUser?その後、使用するたびに区別できます。

于 2012-05-08T18:45:54.483 に答える
0

オブジェクトの代わりにIDを割り当ててみてください

project = Project.objects.create(owner_id=request.user.pk)
于 2012-05-08T19:09:08.297 に答える