根据登录用户过滤Django管理控制台行

时间:2015-04-13 06:55:17

标签: python django django-models django-admin

我想根据登录的用户限制Django管理控制台中显示哪些行。使用AuthUser模型,我创建了以下帐户模型,将Django用户帐户链接到我的数据库中的特定企业:

class Account(models.Model):
    id = models.AutoField(primary_key=True, editable=False)
    username_id = models.ForeignKey('AuthUser', db_column='username_id')
    business_id = models.ForeignKey('Business', db_column='business_id')

这是我的商业模式:

class Business(models.Model):
    id = models.AutoField(primary_key=True, editable=False)
    name = models.CharField(max_length=45)
    address = models.CharField(max_length=45)

当用户登录时,我想限制用户,以便他们只能为我们的数据库(通过Django管理控制台)添加/查看/删除条目以用于各自的业务。这是我的入门型号:

class Entry(models.Model):
    id = models.AutoField(primary_key=True, editable=False)
    business = models.ForeignKey('Business')
    entry_text = models.CharField(max_length=300)
    created = models.DateField(auto_now=True)

有没有一种简单的方法可以实现这一目标?

1 个答案:

答案 0 :(得分:3)

在您的模型管理员中,您可以覆盖方法get_queryset()

所以你可以做点什么,

 class EntryAdmin(admin.ModelAdmin):
      def get_queryset(self, request):
          qs = super(EntryAdmin, self).get_queryset(request)
          if request.user.is_superuser:
              return qs
          return qs.filter(business__in=request.user.account_set.all().values_list('business_id', flat=True))

最后一行qs.filter(business__in=request.user.account_set.all().values_list('business_id', flat=True))过滤初始查询集(默认为所有条目)。

request.user.account_set.all()返回与用户关联的所有Account个对象。是的,您设计Account模型的方式将允许多个对象与用户相关联。如果要将其限制为1,则应考虑使用OneToOneField

向查询集追加.values_list('business_id', flat=True)告诉Django您只想返回特定的列,在本例中只是business_id列。 values_list返回元组列表,但如果您只需要查询集中的一列,则可以传递关键字参数flat=True,这将返回一个平面列表。