我想根据登录的用户限制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)
有没有一种简单的方法可以实现这一目标?
答案 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
,这将返回一个平面列表。