我有用户,每个用户都与他们可以访问的房地产属性列表相关联。多个用户可能有权查看同一站点。
我怎么在django中设置它?
我有:
class UserProfile(models.Model):
user = models.OneToOneField(User)
last_session_time_online = models.IntegerField()
total_time_online = models.IntegerField()
def __unicode__(self):
return self.user
和
class Site(models.Model):
site_name = models.CharField(max_length = 512)
...Other stuff...
def __unicode__(self):
return self.user
这是基本的多对多内容:
class Site(models.Model):
site_name = models.CharField(max_length = 512)
allowed_users = models.ManyToManyField(User)
...
sam = User.objects.get(username = 'sam')
frodo = User.objects.get(username = 'frodo')
hobbithole = Site.objects.get(site_name = 'The Hobbit Hole')
hobbithole.allowed_users.add(sam, frodo)
frodo.site_set.all() # Should return "The Hobbit Hole" object, and any other place frodo's allowed to visit.
somesite.allowed_users.exists(user = frodo) # returns True if frodo is in the site's set of allowed users.
如果你不想杂乱 Site
,您还可以创建一个中间的“通过”表。这会创建一个间接层,但是如果需要,您可以像通过权限一样将内容添加到直通表中。你可以使用 auth
模块 groups
该表上的功能用于定义“可以访问密钥的组”和“可以修改属性的组”等。
Django中的许多字段
这最近出现了,但我找不到有关SO的相关问题。相反,这里是我从讨论中保存的一些链接,以便稍后阅读:
Django现在支持对象权限。除了 处理对象权限,与另一个答案相关联, REST Framework权限指南 值得一读。
您将需要添加代码 Meta
每个权限的模型的子类:
class Meta:
permissions = (
('edit_this_model', 'Edit this model'),
)
如果您使用南方,则可能需要运行 manage.py syncdb --all
更新模型后。
要测试用户是否经过身份验证,请使用如下命令:
user.has_perm('your_app_name. edit_this_model')
试试Django-Guradian。您可以使用它为用户/组分配对象级别权限。