2016-03-31 6 views
0

Ich habe diese Modelle:Wie man eine Oberklassenmethode aufruft und die Unterklassenimplementierung zurückbringt?

from django.db import models 

class Item(models.Model): 
    # ... 

    def __str__(self): 
     return 'item' 

class SubItemA(Item): 
    # ... 

    def __str__(self): 
     return 'subitem_a' 

class SubItemB(Item): 
    # ... 

    def __str__(self): 
     return 'subitem_b' 

Und ich will die __str__ Methode von jedem Punkt in Item.object.all() aufrufen und jede Unterklasse Implementierung zurück, sondern nur die übergeordnete Klasse Implementierung zurück.

Beispiel:

for item in Item.object.all(): 
    print(item.__str__()) 

Auf meiner Datenbank Ich habe zwei SubItemA und zwei SubItemB. Als es zurückgibt:

item 
item 
item 
item 

würde Ich mag einige Sache wie diese haben:

subitem_a 
subitem_a 
subitem_b 
subitem_b 

ich hier bin verloren.

+0

zu verwenden, mit dem Sie auf mehr Probleme stolpern werden. Eine saubere Lösung ohne ein Rad neu zu erfinden ist etwas wie Django Polymorph zu verwenden https://github.com/chrisglass/django_polymorph – yedpodtrzitko

+0

@yedpodtrzitko Vielen Dank! Es löste mein Problem wie ein Zauber! Bitte, schreibe eine Antwort, damit ich dafür stimmen kann. – rhemzo

Antwort

1

Es ist ein bisschen beteiligt. Sie können Django model subclassing: Get the subclass by querying the superclass für eine vollständige Diskussion betrachten.

Kurze Antwort, aus dieser Frage:

def related_object(self, default_pointer_name='_ptr'): 
    models = [A,B] #models 
    object = None 

    argument = '%s%s' %(self.__class__.__name__.lower(), default_pointer_name) 
    query = { argument : self} 

    for model in models: 
     try: 
      object = model.objects.get(**query) 
     except model.DoesNotExist: 
      pass 
     else: 
      return object 

    if object == None: 
     raise RelatedObjectException 
    return object 

# This is a method used by BaseMedium. 
Verwandte Themen