Django管理员非员工访问数据过滤


昵称不能为空
2025-03-12 12:02:01 (19天前)
  1. 用户,但这感觉有点矫枉过正,甚至更难以管理。

或者只是将用户列添加到每个Model中

数据
</跨度>

滤波
</跨度>
用户需要使其更容易

过滤
</跨度>

有关最佳方法的任何想法?
用户创建的…由该用户看到。

目前我只是使用默认的管理包并将“客户端用户”的权限更改为

过滤
</跨度>
什么

数据
</跨度>
他们可以看到(我只希望他们看到……

2 条回复
  1. 0# star*위위 | 2019-08-31 10-32



    首先,根据经验,您最好在实际的django应用程序中使用,为用户提供编辑和创建功能

    View

    秒。通用视图使这很容易。一旦你让你的用户进入管理员,他们就会习惯它并且很难让他们离开。



    另外你应该使用

    contrib.auth.Group

    和…一起

    Django的守护者

    跟踪对象级权限而不是自己实现它。

    从长远来看,这是值得的。
    </强>



    如果您想自己创造这种体验,那么您有多种明智的选择:





    • owner

      在根目标中

      ForeignKey

      金字塔



    • owner

      在每个模型上



    要实现第一个选项,你应该在每个模型上实现两个方法

    ForeignKey

    链:




    1. 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

    2. </code>


    但是,如你所说,这会产生很多

    JOINS

    如果您的架构足够复杂。



    我会建议你在每个模型中存储有关所有者的信息,其他一切都是我经验中的维护噩梦。



    您应该使用继承,而不是手动将字段手动添加到每个模型。但是,django通过关系为继承提供了错误的内置支持:抽象基础模型无法定义

    models.ForeignKey

    ,所以你坚持使用基于表的继承。



    基于表的继承带来了另一个问题:考虑以下模型:




    1. 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)

    2. </code>


    很容易找到

    owner

    给定实例的

    ChildA

    要么

    ChildB




    1.   >>> obj = ChildA.objects.create(owner=Peter, name="alex")    
    2. obj.owner

    3. </code>


    彼得



    但是,找到特定用户拥有的所有对象并非易事:



    1.   >>> Base.objects.filter(owner=Peter)
    2. </code>


    默认管理器返回一个Base对象,但不包含有关它是否为a的信息

    ChildA

    要么

    ChildB

    例如,这可能很麻烦。



    为了避免这种情况,我建议使用多态方法

    Django的多态

    要么

    Django的模型utils的

    ,这是更轻量级的。它们都提供了检索给定子类的方法

    Base

    查询中的模型。
    有关django中多态性的更多信息,请参阅我的答案。



    这些也会招致

    JOIN

    s,但至少复杂性是可控的。


登录 后才能参与评论