Cer*_*rin 8 python sql django sparql django-orm
我正在尝试使用Django的ORM实现一个简单的三元组.我希望能够搜索任意复杂的三重模式(例如,与SparQL一样).
为此,我试图使用.extra()方法.但是,即使文档提到它,理论上也可以通过自动为重复表引用创建别名来处理对同一个表的重复引用,我发现它在实践中不会这样做.
例如,假设我的"三重"应用程序中有以下模型:
class Triple(models.Model):
subject = models.CharField(max_length=100)
predicate = models.CharField(max_length=100)
object = models.CharField(max_length=100)
Run Code Online (Sandbox Code Playgroud)
我的数据库中存储了以下三元组:
subject predicate object
bob has-a hat .
bob knows sue .
sue has-a house .
bob knows tom .
Run Code Online (Sandbox Code Playgroud)
现在,说我想查询所有人的名字鲍勃知道谁有房子.在SQL中,我只是这样做:
SELECT t2.subject AS name
FROM triple_triple t1
INNER JOIN triple_triple t2 ON
t1.subject = 'bob'
AND t1.predicate = 'knows'
AND t1.object = t2.subject
AND t2.predicate = 'has-a'
AND t2.object = 'house'
Run Code Online (Sandbox Code Playgroud)
我不完全确定使用Django的ORM会是什么样子,尽管我认为这将是:
q = Triple.objects.filter(subject='bob', predicate='knows')
q = q.extra(tables=['triple_triple'], where=["triple_triple.object=t1.subject AND t1.predicate = 'has-a' AND t1.object = 'house'"])
q.values('t1.subject')
Run Code Online (Sandbox Code Playgroud)
不幸的是,这失败了错误"DatabaseError:no such column:t1.subject"
运行打印q.query显示:
SELECT "triple_triple"."subject" FROM "triple_triple" WHERE ("triple_triple"."subject" = 'bob' AND "triple_triple"."predicate" = 'knows'
AND triple_triple.object = t1.subject AND t1.predicate = 'has-a' AND t1.object = 'house')
Run Code Online (Sandbox Code Playgroud)
这似乎表明,我对.extra()的调用中的表格参数被忽略,因为没有第二次引用插入到任何地方的triple_triple.
为什么会这样?使用Django的ORM在同一个表中的记录之间引用复杂关系的适当方法是什么?
编辑:我发现这个有用的片段通过.extra()包含自定义SQL,以便它可以在模型管理器中使用.
Tom*_*gli 13
我认为你缺少的是select参数(对于额外的方法)
这似乎有效:
qs = Triple.objects.filter(subject="bob", predicate="knows").extra(
select={'known': "t1.subject"},
tables=['"triple_triple" AS "t1"'],
where=['''triple_triple.object=t1.subject
AND t1.predicate="has-a" AND t1.object="'''])
qs.values("known")
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4512 次 |
| 最近记录: |