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

标签 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 的基类而不是我的代理类。有没有办法将我的代理用户作为外键引用?

最佳答案

除了@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

关于python - 将代理模型实例分配给外键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10504521/

相关文章:

python - 如何使用 ImageGrab.grab().load() 函数或任何其他函数来获取像素更新?

django - "transaction.atomic"与 "transaction.commit_on_success"相同吗?

python - 在 Django 中显示表条目列表

python - 是否可以手动重启 celery 任务

python - apache 日志中没有任何内容的 500 错误

python - 将包含 UTF-8 和 Null 的 DataFrame 转换为字符串而不丢失数据

python - 在字典列表中查找重复项

Django:将表单数据保存到数据库

jquery - django-tastypie PATCH 给了我一个 "400 (Bad Request)"

javascript - 从 javascript 执行 python 脚本