2011-10-27 2 views
6

와 나는 약간의 장고 모델을 가지고사용`issubclass()`장고 모델

class Foo(models.Model): 
    class Meta: 
     abstract = True 

class Bar(Foo) 
    pass 

내가 그들과 함께 작업을 수행하기 위해, 푸에서 상속 모든 모델을 찾을 수 있도록하고 싶습니다 말한다. 그것은

from django.db import models 
from myapp.models import Foo 

for model in models.get_models(): 
    if issubclass(model, Foo): 
     do_something() 

아아처럼 쉬워야한다, 이것은 아마도 모델을 초기화 장고 메타 클래스의 내부 작업의 결과로, issubclass(Bar, Foo) 보고서 False 때문에 작동하지 않습니다.

장고 모델이 장고 모델의 자손인지 여부를 확인하는 방법이 있습니까?

해결책으로 오리 타이핑을 제안하지 마십시오. 이 경우 서브 클래스 관계가 있는지 여부를 알고 싶습니다.

+0

같은 질문을하는 ... 많은 테스트와 코드 내성 검사가 끝나면 추상 모델이 호출 가능하고 아들 객체가이 속성에 적합한 속성이나 메소드를 갖고 있지 않아서 가능하지 않은 것 같습니다. 필요합니다. – Oleiade

+1

이상하게 보입니다 ... 방금 virtualenv에 새로운 django 응용 프로그램을 만들었고 코드가 작동하고 있습니다. 'do_something()'은 단순히 '인쇄 모델'일 뿐이며 작동합니다. 결과 : . 문제가 추상적으로 발생 했습니까? 참고 장고를 사용하고 있습니다. 1.3.1 –

+1

또한 장고에 대해 저에게 잘 알려져 있습니다. 1.3.1 – Brandon

답변

0

어쩌면

subclasses = Foo.__subclasses__() 
for subclass in subclasses: 
    # we need to keep looking for subclasses of the subclasses 
    subclasses += subclass.__subclasses__() 
# sometimes we don't care about abstract classes 
concrete_subclasses = filter(lambda c: not c._meta.abstract, subclasses) 
1

문제 같은 것을 사용하면 클래스를 가져 오는 방법이다. 대신 :

print models.get_models() 
+0

'myapp.models'을 사용하여 가져 오는 경우 왜 문제가 발생하는지 설명 할 수 있습니까? 그런 다음 재사용 가능한 응용 프로그램을 작성하려면 프로젝트 이름없이 가져 오기 작업을 작성해야합니다. 그렇지 않으면 틀린가요? – zambotn

0

사용

Bar._meta.get_base_chain(Foo) 
:

from myapp.models import Foo 

사용 : 장고와 모델을 가져 오는 방법

from myproject.myapp.models import Foo 

올바른 방법이 무엇인지 보려면, 당신이 볼 수

인계를 설명하는 목록을 얻으려면 FooBar 사이의 nce 체인.