【问题标题】:Django model query with custom select fields带有自定义选择字段的 Django 模型查询
【发布时间】:2009-06-22 09:12:19
【问题描述】:

我正在使用称为 django-granular-permissions (http://code.google.com/p/django-granular-permissions/) 的行级权限模型。权限模型只是多了两个字段,即内容类型和对象 ID。

我使用了以下查询:

 User.objects.filter(Q(row_permission_set__name='staff') | \
     Q(row_permission_set__name='student'), \
     row_permission_set__object_id=labsite.id)

我想将is_staff 和is_student 布尔字段添加到结果集中,而不是每次获取结果时都进行查询。

Django 文档显示了查询集的 extra() 方法,但我不知道应该为具有这种关系的普通 SQL 选择查询写什么。

如何做到这一点?

【问题讨论】:

  • 在每个查询中包含此限定条件有什么问题?您有性能问题吗?
  • 不,上面的查询是完全可以的。但我想要的是在结果集对象中添加 is_staff 和 is_boolean 额外字段。

标签: python django django-models


【解决方案1】:
.extra(select={'is_staff': "%s.name='staff'" % Permission._meta.db_table, 'is_student': "%s.name='student'" % Permission._meta.db_table, }) 

【讨论】:

  • 我错误地投了反对票。除非编辑答案,否则我可以进行任何更改的时间限制已经过去。如果您进行任意更改,我将纠正我的错误以进行投票。干杯!
【解决方案2】:

通常你会使用 select_related() 来处理这样的事情,但不幸的是它不适用于反向关系。你可以做的是把查询转过来:

users = [permission.user for permission in Permission.objects.select_related('user').filter(...)]

【讨论】:

  • 在您的查询中,我如何确定每个用户是否具有某些权限? (尤其是方便的模板形式)
  • 由于 Permission 对象上的过滤器(您只需过滤掉所需的权限),列表中的所有用户都将拥有所需的权限。如果您需要做的只是显示具有所需权限的用户,这比 .extra() 更简单。如果您需要列出 所有 用户,然后为那些拥有某些权限的用户做特定的事情,那么 extra() 就是要走的路。
猜你喜欢
  • 2013-09-13
  • 2021-10-19
  • 2018-06-02
  • 1970-01-01
  • 1970-01-01
  • 2012-11-26
  • 1970-01-01
  • 1970-01-01
  • 2013-03-04
相关资源
最近更新 更多