帮助使用django的ORM进行UNION查询

时间:2010-09-13 15:40:38

标签: django orm

我正在为网站制作历史页面。我的类的结构是这样的:

alt text

class Person(models.Model):
    name = models.CharField(max_length=100)
    type = models.CharField(max_length=30)

class History(models.Model):
    date = models.DateField(max_length=100)
    action = models.CharField(max_length=250)
    person = models.ForeignKey(Person)

class Parent(Person):
    #some attributes that are not relevant

class Son(Person)
    parent = models.ForeignKey(Parent)
    #other attributes that are not relevant

非常简单...我有一个,有多个儿子,他们都可以在网站上执行操作,并且全部保存在历史记录表中,该表引用了执行该操作的Person。历史表类似于:

date       | action        | person_id 
----------------------------------------
16-12-2010 | saved profile | 1
16-12-2010 | new child     | 2

对于父母我需要显示他所有的行为和他儿子的行为 使用sql将是:

SELECT * FROM History where person_id=1 
UNION 
SELECT h.* FROM History h JOIN Son s ON s.person_ptr_id=h.person_id WHERE s.parent_id=1 

但我不知道如何使用django的ORM来做到这一点。 Myabe使用两个查询?一个循环? 你有什么想法?我真的很感激一些帮助..提前谢谢

BTW:我正在使用django 1.1

编辑:我在课程中添加了属性。这些只是示例,我的表有更多属性,但这就是django将关系转换为表的方式

1 个答案:

答案 0 :(得分:1)

我认为这是sql:

p = Parent.objects.get(id=1)
history_qs = History.objects.all()
history_qs = history_qs.filter(Q(person=p)|Q(person__in=Son.objects.filter(parent=p)))

没有必要结合。