2010-09-13 62 views
0

我正在爲網站製作歷史記錄頁面。我的課的結構是這樣的:幫助使用django的ORM進行UNION查詢

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 

它很簡單......我有一個具有多個父子都可以在網站上做行動和它們全部保存在歷史記錄表格中,該表格具有對執行動作的人員的引用。歷史表是這樣的:一個家長,我需要顯示他的所有行動和他的兒子 使用sql的動作

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

這將是:

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來做到這一點。使用兩個querys的Myabe?一個循環? 你有什麼想法嗎?我真的很感激一些幫助..在此先感謝

BTW:我使用的Django 1.1

編輯:我在類中添加的屬性。這些只是例子,我的表有更多的屬性,但是這是Django是如何翻譯的關係到表

+0

你可以發佈模型的源代碼嗎?外鍵關係就足夠了。 – 2010-09-13 16:06:44

+0

@manoj完成! =) – pleasedontbelong 2010-09-13 16:45:22

+0

@pleasedontbelong:你在Django中將'Person'建模爲抽象類嗎?此外,是否將'Parent'和'Son'建模爲單獨的類?這將意味着不同的表格。使用一個類來建模它們是否有意義,並且外鍵指向同一個類? – 2010-09-13 17:04:22

回答

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))) 

工會不necesary。

+0

謝謝!工作正常 – pleasedontbelong 2010-09-14 07:09:44