基于国家的超级用户访问权限

时间:2010-08-20 15:54:52

标签: python django database-design django-models

我希望为属于特定国家/地区的实体提供超级用户访问权限。

例如。瑞典SU只能管理瑞典实体等......

然而,我是django的新手(接管一个旧系统),我需要一条生命线。

我希望能够指定关系表。

我已经添加了一个userprofile,并且我有一个名为super_user_country_link = models.ForeignKey的新字段(SuperUserToCountry,blank = True,null = True)

然后在新课程

下面
class SuperUserToCountry(models.Model):
    user = models.ForeignKey(User)
    country = models.ForeignKey(Country) 

我计划运行脚本,然后为每个超级用户添加一个条目,并为它们提供一个指向国家0的链接(即,没有country => su su访问权限)。 然后,当我开始将特定于国家/地区的条目放入时,我可以删除这些条目 所以后来我可以打电话(以房子为例):

if user.is_superuser:
    if user.get_profile().super_user_county_link.country == 0:
        #show house detail...
    elsif user.get_profile().super_user_county_link.country == 0
        #show house detail...
    else
        pass

所以看一下,这应该意味着我可以针对单个用户列出多个国家/地区,对吧?也许我过度思考它,但这看起来是否正确?

我来自一个php背景,所以我对这是多么正确的方式略显怀疑......

1 个答案:

答案 0 :(得分:1)

如果我错了,请纠正我。在我看来,您正试图在UserProfileCountry之间建立多对多的关系。如果是这样,最好的方法是使用ManyToManyField。像这样:

class UserProfile(models.Model):
    countries = models.ManyToManyField(Country)

只要您没有将任何其他信息存储为此关系的一部分,您就可以不需要单独的模型(SuperUserToCountry)。如果您计划存储其他信息,则有way for that too

此处不需要条件blank = Truenull = True。如果没有国家/地区与用户个人资料相关联,则国家/地区将返回空的丢失(即an_instance.countries.all()将为空)。

当您开始添加国家/地区时,您可以执行以下操作:

profile = User.get_profile()
denmark = Country.objects.get(name = 'Denmark')
russia  = Country.objects.get(name = 'Russia')

if denmark in profile.countries.all():
    print "Something is rotten in the state of Denmark"
elsif russia in profile.countries.all():
    print "In Soviet Russia, profiles have countries!"

根据您的具体需要,最有可能更准确地表达上述条件。顺便提一下,您会将国家/地区添加到用户的个人资料中,如下所示:

profile = User.get_profile()
denmark = Country.objects.get(name = 'Denmark')
profile.countries.add(denmark)