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