首先,根据经验,您最好在实际的django应用程序中使用,为用户提供编辑和创建功能
View
秒。通用视图使这很容易。一旦你让你的用户进入管理员,他们就会习惯它并且很难让他们离开。
另外你应该使用
contrib.auth.Group
和…一起
Django的守护者
跟踪对象级权限而不是自己实现它。
的
从长远来看,这是值得的。
</强>
如果您想自己创造这种体验,那么您有多种明智的选择:
owner
在根目标中
ForeignKey
金字塔
owner
在每个模型上
要实现第一个选项,你应该在每个模型上实现两个方法
ForeignKey
链:
def get_parent(self):
“””Should return the object that should be queried for ownership information”””
pass
def owned_by(self, user):
“””Should return a boolean indicating whetheruser
owns the object, by queryingself.get_parent().owned_by(user)
“””
pass
</code>
但是,如你所说,这会产生很多
JOINS
如果您的架构足够复杂。
我会建议你在每个模型中存储有关所有者的信息,其他一切都是我经验中的维护噩梦。
您应该使用继承,而不是手动将字段手动添加到每个模型。但是,django通过关系为继承提供了错误的内置支持:抽象基础模型无法定义
models.ForeignKey
,所以你坚持使用基于表的继承。
基于表的继承带来了另一个问题:考虑以下模型:
from django.db import models
from app.settings import AUTH_USER_MODEL
class Base(models.Model):
owner = models.ForeignKey(AUTH_USER_MODEL)
class ChildA(Base):
name = models.CharField(max_length=5)
class ChildB(Base):
location = models.CharField(max_length=5)
</code>
很容易找到
owner
给定实例的
ChildA
要么
ChildB
:
>>> obj = ChildA.objects.create(owner=Peter, name="alex")
obj.owner
</code>
彼得
但是,找到特定用户拥有的所有对象并非易事:
>>> Base.objects.filter(owner=Peter)
</code>
默认管理器返回一个Base对象,但不包含有关它是否为a的信息
ChildA
要么
ChildB
例如,这可能很麻烦。
为了避免这种情况,我建议使用多态方法
Django的多态
要么
Django的模型utils的
,这是更轻量级的。它们都提供了检索给定子类的方法
Base
查询中的模型。
有关django中多态性的更多信息,请参阅我的答案。
这些也会招致
JOIN
s,但至少复杂性是可控的。