- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
简而言之:我的模型是 B --> A <-- C,我想过滤 Bs 其中至少有一个 C> 存在,满足一些任意条件并且与 A 和 B 相关。也感谢您帮助解决一些复杂的因素(见下文)。
详细信息:
我正在尝试创建一个通用模型来限制用户访问其他模型中的行。这是一个(简化的)示例:
class CanRead(models.Model):
user = models.ForeignKey(User)
content_type = models.ForeignKey(ContentType)
object_id = models.PositiveIntegerField()
content_object = generic.GenericForeignKey('content_type', 'object_id')
class Direct(models.Model):
...
class Indirect(models.Model):
direct = models.ForeignKey(Direct)
...
class Indirect2(models.Model):
indirect = models.ForeignKey(Indirect)
...
将 CanRead 关联到每个模型中的每一行是不可行的(在空间上成本太高),因此只有一些模型应该具有这种关联(例如 Direct以上)。在这种情况下,以下是我查看用户是否可以访问 Direct 的方法:
Direct.objects.filter(Q(canread__user=current_user), rest_of_query)
(不幸的是,这个查询将不起作用 - 至少在 1.2.5 中 - 因为通用 fk;任何对此的帮助将不胜感激,但有解决方法,真正的问题是接下来的内容)
其他人的可访问性将取决于他们与其他模型的关系。因此,如果 direct 是可访问的,则用户将可以访问 Indirect,如果 indirect__direct 是,则 Indirect2 将是,等等
我的问题是,我该如何执行此查询?我很想写这样的东西:
Indirect.objects.filter(Q(canread__content_object=F('direct'), canread__user=current_user), rest_of_query)
Indirect2.objects.filter(Q(canread__content_object=F('indirect__direct'), canread__user=current_user), rest_of_query)
但这不起作用(Django 期望 CanRead 和 Indirect 之间存在关系——这并不存在——以便反向查询起作用)。如果我直接用 SQL 编写它,我会做类似的事情:
SELECT *
FROM indirect i
JOIN direct d ON i.direct = d.id
JOIN canread c ON c.object_id = d.id
WHERE
c.content_type = <<content type for Direct>> AND
c.user = <<current user>> AND
<<rest_of_query>>
但我无法将该查询转换为 Django。可能吗?如果不是,那么干扰最小的方法是什么(尽可能少地使用原始 SQL)?
感谢您的宝贵时间!
注意:提到的解决方法是不使用通用 fk... :( 我可以放弃 CanRead 模型并有许多 CanReadDirect、CanReadDirect2、CanReadDirect3 等。这是一个小麻烦,但不会对我的项目造成太大阻碍。
最佳答案
对于您给出的简单案例,解决方案很简单:
B.objects.filter(a__c__isnull=False)
对于实际查询,这是我的尝试:
Indirect.objects.filter(direct__id__in=
zip(*CanRead.objects.filter(
content_type=ContentType.objects.get_for_model(Direct)
).values_list('id'))[0])
但这种方式非常慢:您从一个查询集中提取 ID,然后使用
where id in (1, 2, 3, ... 10000)
这是非常慢的。我们在项目中的通用外键连接上遇到了类似的问题,因此决定求助于模型管理器中的原始查询。
class DirectManager(Manager):
def can_edit(self, user):
return self.raw(...)
我还建议查看 per-row permissions Django 1.3 中的框架。
关于django - Django 中的复杂反向查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7775535/
我有三张 table 。表 A 有选项名称(即颜色、尺寸)。表 B 有选项值名称(即蓝色、红色、黑色等)。表C通过将选项名称id和选项名称值id放在一起来建立关系。 我的查询需要显示值和选项的名称,而
在mysql中,如何计算一行中的非空单元格?我只想计算某些列之间的单元格,比如第 3-10 列之间的单元格。不是所有的列...同样,仅在该行中。 最佳答案 如果你想这样做,只能在 sql 中使用名称而
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 7 年前。 Improve this ques
我正在为版本7.6进行Elasticsearch查询 我的查询是这样的: { "query": { "bool": { "should": [ {
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 7 年前。 Improve this ques
是否可以编写一个查询来检查任一子查询(而不是一个子查询)是否正确? SELECT * FROM employees e WHERE NOT EXISTS (
我找到了很多关于我的问题的答案,但问题没有解决 我有表格,有数据,例如: Data 1 Data 2 Data 3
以下查询返回错误: 查询: SELECT Id, FirstName, LastName, OwnerId, PersonEmail FROM Account WHERE lower(PersonEm
以下查询返回错误: 查询: SELECT Id, FirstName, LastName, OwnerId, PersonEmail FROM Account WHERE lower(PersonEm
我从 EditText 中获取了 String 值。以及提交查询的按钮。 String sql=editQuery.getText().toString();// SELECT * FROM empl
我有一个或多或少有效的查询(关于结果),但处理大约需要 45 秒。这对于在 GUI 中呈现数据来说肯定太长了。 所以我的需求是找到一个更快/更高效的查询(几毫秒左右会很好)我的数据表大约有 3000
这是我第一次使用 Stack Overflow,所以我希望我以正确的方式提出这个问题。 我有 2 个 SQL 查询,我正在尝试比较和识别缺失值,尽管我无法将 NULL 字段添加到第二个查询中以识别缺失
什么是动态 SQL 查询?何时需要使用动态 SQL 查询?我使用的是 SQL Server 2005。 最佳答案 这里有几篇文章: Introduction to Dynamic SQL Dynami
include "mysql.php"; $query= "SELECT ID,name,displayname,established,summary,searchlink,im
我有一个查询要“转换”为 mysql。这是查询: select top 5 * from (select id, firstName, lastName, sum(fileSize) as To
通过我的研究,我发现至少从 EF 4.1 开始,EF 查询上的 .ToString() 方法将返回要运行的 SQL。事实上,这对我来说非常有用,使用 Entity Framework 5 和 6。 但
我在构造查询来执行以下操作时遇到问题: 按activity_type_id过滤联系人,仅显示最近事件具有所需activity_type_id或为NULL(无事件)的联系人 表格结构如下: 一个联系人可
如何让我输入数据库的信息在输入数据 5 分钟后自行更新? 假设我有一张 table : +--+--+-----+ |id|ip|count| +--+--+-----+ |
我正在尝试搜索正好是 4 位数字的 ID,我知道我需要使用 LENGTH() 字符串函数,但找不到如何使用它的示例。我正在尝试以下(和其他变体)但它们不起作用。 SELECT max(car_id)
我有一个在 mysql 上运行良好的 sql 查询(查询 + 连接): select sum(pa.price) from user u , purchase pu , pack pa where (
我是一名优秀的程序员,十分优秀!