将代理模型实例分配给外键

时间:2012-05-08 18:43:04

标签: python django

我有一个django auth用户代理模型,它附加了一些额外的权限,如下所示:

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)

在我的一个视图中,我尝试使用当前用户作为所有者

创建一个新项目
@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 User的基类而不是我的代理类。有没有办法将我的代理用户称为外键?

3 个答案:

答案 0 :(得分:18)

除了@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 是-a User,但User a UserProxy

答案 1 :(得分:2)

为什么要调用代理类User,这会导致其与django.contrib.auth.models.User之间的混淆?为什么不UserProxyMyUser?然后,无论何时使用它都可以区分。

答案 2 :(得分:0)

尝试分配id而不是object

project = Project.objects.create(owner_id=request.user.pk)