Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将代理模型实例分配给外键_Python_Django - Fatal编程技术网

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

Python 将代理模型实例分配给外键,python,django,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"),

我有一个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.
无法分配“”:“Project.owner”必须是“User”实例。

我假设项目对象中的外键所有者引用的是Django User的基类,而不是我的代理类。有没有一种方法可以将我的代理用户称为外键?

为什么要调用代理类
user
,这肯定会导致它与
django.contrib.auth.models.user
之间的混淆?为什么不
UserProxy
,或者
MyUser
?然后,无论何时使用它,都可以对其进行区分。

尝试分配id而不是对象

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

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

可能重复的Hmmm,这实际上是一个很好的观点。到目前为止,除了像
User.has\u perm()
这样的内置函数外,我没有在任何上下文中使用过
User
。我记不起我最初使用同一个名字的原因了,所以我会试着改变它,看看会有什么中断。我会接受这是最好的答案,因为这显然是我应该采取的步骤。在这一点上,我正在深入研究扩展用户模型的丛林以及由此带来的所有乐趣。尽管我接受了DavidRobinson的回答,但感谢您提供的额外信息。