Я пытаюсь реализовать простой триплет с использованием 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)
, и в моей базе данных хранятся следующие тройки:
subject predicate object
bob has-a hat .
bob knows sue .
sue has-a house .
bob knows tom .
Теперь, скажем, я хочузапросите имена всех, кто знает, у кого есть дом.В 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'
Я не совсем уверен, как это будет выглядеть с 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')
К сожалению, эта ошибка завершается ошибкой «DatabaseError: нет такого столбца: t1.subject»
Запуск print 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')
, что указывает на то, что таблицыparam в моем вызове .extra () игнорируется, так как нет второй ссылки на triple_triple, вставленной где-либо.
Почему это происходит?Как правильно ссылаться на сложные отношения между записями в одной и той же таблице, используя ORM Джанго?
РЕДАКТИРОВАТЬ: я нашел этот полезный фрагмент для включения собственного SQL через .extra (), так что этоможно использовать в менеджере моделей.