2016-03-31 3 views
0

У меня есть эти модели:Как вызвать метод суперкласса и вернуть реализацию подкласса?

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' 

И я хочу, чтобы вызвать метод __str__ из каждого пункта в Item.object.all() и возвращать каждый реализации подкласса, но он возвращает только суперкласса реализации.

Пример:

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

В моей базе данных у меня есть два SubItemA и два SubItemB. Чем она возвращает:

item 
item 
item 
item 

Я хотел бы иметь некоторые вещи, как это:

subitem_a 
subitem_a 
subitem_b 
subitem_b 

Я потерял здесь.

+0

с этим вы столкнетесь с большим количеством проблем. Чистым решением, не изобретая колесо, является использование чего-то вроде Django Polymorphic https://github.com/chrisglass/django_polymorphic – yedpodtrzitko

+0

@yedpodtrzitko Спасибо! Он решил мою проблему как шарм! Пожалуйста, напишите ответ, чтобы я мог проголосовать за него. – rhemzo

ответ

0

С этим вы будете наткнуться больше проблем. Чистым решением, не изобретая колесо, является использование чего-то вроде Django Polymorphic

1

Это немного связано. Вы можете посмотреть Django model subclassing: Get the subclass by querying the superclass для полного обсуждения.

Короткий ответ, от этого вопроса:

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. 
Смежные вопросы