2011-10-27 18 views
6

साथ मैं, कुछ Django मॉडल का कहना है किका उपयोग करते हुए `issubclass()` Django मॉडल

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

आह की तरह, यह शायद Django metaclass कि मॉडल initializes के भीतर काम कर रहे एक परिणाम के रूप में काम नहीं करता, issubclass(Bar, Foo) रिपोर्ट False के बाद से,।

क्या यह जांचने का कोई तरीका है कि एक Django मॉडल एक अमूर्त Django मॉडल का वंशज है या नहीं?

कृपया, समाधान के रूप में बतख टाइपिंग का सुझाव न दें। इस मामले में, मैं वास्तव में जानना चाहता हूं कि सबक्लास संबंध मौजूद है या नहीं।

+0

खुद को एक ही प्रश्न पूछना ... कई परीक्षणों और कोड आत्मनिरीक्षण के बाद, मुझे लगता है कि ऐसा संभव नहीं लगता है, क्योंकि अमूर्त मॉडल कॉलबेल हैं, और बेटे ऑब्जेक्ट्स में कोई विशेषता या विधियां नहीं हैं जो इसे फिट करती हैं की जरूरत है। – Oleiade

+1

अजीब लगता है ... मैंने अभी वर्चुअलनव में एक नया django ऐप बनाया है, और आपका कोड काम कर रहा है, मेरा 'do_something()' बस एक 'प्रिंट मॉडल' है और यह काम करता है। नतीजा: । क्या आप सुनिश्चित हैं कि आपकी समस्या अमूर्त से आती है? एफवाईआई मैं django 1.3.1 –

+1

का उपयोग कर रहा हूं Django 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

समस्या कुछ कैसे आप वर्गों आयात है। बजाय:

from myapp.models import Foo 

उपयोग:

from myproject.myapp.models import Foo 

सही तरीका है क्या देखने के लिए, आप देख सकते हैं कि Django के साथ अपने मॉडल आयात कर रहा है:

print models.get_models() 
+0

क्या आप समझा सकते हैं कि अगर मैं 'myapp.models' का उपयोग करके आयात करता हूं तो कोई समस्या क्यों है? फिर यदि मैं एक पुन: प्रयोज्य ऐप लिखना चाहता हूं, तो मुझे परियोजना के नाम के बिना आयात-चीजें लिखनी होंगी, या मैं गलत हूं? – zambotn

0

उपयोग

Bar._meta.get_base_chain(Foo) 

विरासत का वर्णन करने वाली सूची प्राप्त करने के लिए Foo और Bar के बीच एनसी श्रृंखला।

संबंधित मुद्दे