11

我有用户,每个用户都与他们被允许访问的房地产列表相关联。多个用户可能有权查看同一个站点。

我将如何在 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
4

5 回答 5

7

这是基本的多对多的东西:

 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中的多对多字段

于 2011-09-02T00:00:38.050 回答
2

这最近出现了,但我在 SO 上找不到相关问题。相反,这里有一些我从讨论中保存的链接,供以后阅读:

于 2011-09-02T03:04:44.800 回答
2

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')
于 2014-07-10T16:01:08.967 回答
1

这里有很多插件可以做到这一点。

于 2012-07-26T19:58:15.513 回答
0

试试 Django-Guradian。您可以使用它将对象级别权限分配给用户/组。

于 2015-06-26T05:55:11.620 回答