2012-04-12 82 views
0

我有這樣一個模型:擴展機型在Django中

class Model1(models.Model): 
    . 
    . 
    . 

和擴展模型:

class Model2(Model1): 
    . 
    . 
    . 

與此查詢:

model1 = Model1.objects.all() 

我如何才能找到的項目,屬於具有上述查詢的繼承模型(Model2)?

編輯: 我要訪問從型號1這個查詢:

class Model1(models.Model): 
     def is_model2(self): 
     m2 = self.objects.filter(model2__isnull=False) 
      if m2.count() > 0: 
       if self in m2: 
        return True 
       else: 
        return False 

在此先感謝

+0

上述查詢是否檢索屬於'Model1'和'Model2'的項目? – 2012-04-12 12:11:29

+0

是的,它會的,因爲所有'Model2'都是繼承的'Model1'。 – 2012-04-12 12:17:55

回答

0

假設Model1沒有class Meta: abstract = True,這是multi-table inheritance.

你可以使用:

model2 = Model2.objects.all() 

因爲所有Model2對象Model1,或者你可以在同一時間通過你的查詢之一:

for m in model1: 
    try: 
     m.model2 # Try to use the Model2 object 
    except Model2.DoesNotExist: 
     pass 

或過濾器查詢:

q = model1.filter(id__in=Model2.objects.all()) 

很難說哪個選擇是最好從什麼小你給我們。

編輯:如果你只是想一個函數來告訴你,如果一個Model1Model2,那麼你只需要:

​​
+0

或者你可以在一行中快速完成(就像在我的回答中一樣)。 :-) – DrTyrsa 2012-04-12 12:20:10

+0

你真的應該解釋你的答案,它是如何工作的,等等。 – 2012-04-12 12:37:25

+1

'values_list()'是不必要的,''id__in = Model2.objects.all()'就足夠了。 – okm 2012-04-12 13:01:21

1

您還可以使用InheritanceManagerdjango-model-utils。即使查詢基本模型,它也會返回正確的實例。