在英语中,我想检查用户的类型是查看者、版主还是管理员。
这是我的相关部分models.py
class UserType( models.Model ) :
name = models.CharField( max_length = 135 )
# id | name
#----+------------------
# 1 | tenant
# 2 | property manager
# 3 | property owner
# 4 | vendor manager
# 5 | vendor
# 6 | viewer
# 7 | moderator
# 8 | administrator
class UserProfile( models.Model ) :
user = models.OneToOneField( User )
user_types = models.ManyToManyField( UserType, null = True, blank = True )
顺便说一句,我设置user.profile
为与user.get_profile()
.
在我的views.py
代码中,我想做检查。我发现
[ user_type.pk for user_type in user.profile.user_types.all() ]
会给我一个pk
's for the user
's的列表user_type
,就像这样[ 1, 2, 6 ]
。这意味着该特定用户是租户 (1)、物业经理 (2) 和查看者 (6)。
如果我只想检查一个user_type
,那么我可以简单地做
if 6 in [ user_type.pk for user_type in user.profile.user_types.all() ] :
# This user is a viewer
但是如何检查多个 user_types/pks?我想做类似的事情
# This won't work
if [ 6, 7, 8 ] in [ user_type.pk for user_type in user.profile.user_types.all() ] :
# This user is either a viewer, moderator, or administrator
我的列表理解方法也是检查user_types
Django方式吗?看起来不像,但我不知道如何在 Django 中干净地查询它。
欢迎任何提示和建议。提前致谢!
编辑:
我刚刚发现我可以用更多的 Django 方式列出 pksvalues_list
user_types = user.profile.user_types.values_list( 'pk', flat = True )
# [ 1, 2, 6 ]
我还发现我可以像这样检查多个值
if len( set( [ 1, 9 ] ).intersection( set( user_types ) ) )
# True because of 1 is in user_types (don't care about 9)
if len( set( [ 4, 99 ] ).intersection( set( user_types ) ) )
# False because 4 nor 99 is in user_types
但即使这种set
方法似乎也不是对 Django 非常友好。一定有更简单的方法吧?