2017-02-21 134 views
0

我試圖遍歷模板中的子模型實例的屬性,特別是我只想訪問子屬性。在運行時我不會知道它是什麼具體的子類。使用django-model-utils我已經能夠返回子類,而不是父母這是一個開始,但是當我訪問它的屬性,我得到父母雙方孩子的返回:在Django的多表繼承中訪問子模型類屬性

class Product(models.Model): 
     created_at  = models.DateTimeField(default=timezone.now) 
     updated_at  = models.DateTimeField(auto_now=True) 
     name   = models.CharField(...) 
     objects = InheritanceManager() 

     def attrs(self): 
      for attr, value in self.__dict__.iteritems(): 
       yield attr, value 

    class Vacuum(Product): 
     power   = models.DecimalField(...) 

    class Toaster(Product): 
     weight   = models.DecimalField(...) 

views.py

def product_detail(request, slug): 
    product = Product.objects.get_subclass(slug=slug) 

模板

{% for name, value in product.attrs %} 
      <td>{{ name }}</td> 
      <td>{{ value }}</td> 
{% endfor %} 
+0

是不是應該如此?一個孩子繼承父母的屬性,所以'product'屬性例如'created_at'也是正常顯示,否? – LaundroMat

+0

@LaundroMat我認爲是這樣,但我試圖找到一種方法,只返回孩子的屬性,如果這是可能的 – KingFu

+1

噢好吧然後:)也許這個答案可以把你的方式嗎? http://stackoverflow.com/questions/7136154/python-how-to-get-subclasss-new-attributes-name-in-base-classs-method – LaundroMat

回答

1

你能不能做這樣的事情:

def product_detail(request, slug): 
    product = Product.objects.get_subclass(slug=slug) 
    child_fields = [i for i in product.__class__.__dict__ if 
        not i.startswith("__") and not hasattr(Product, i)] 
    product_attrs = [(name, getattr(product,name)) for name in child_fields] 
    # pass product_attrs to your template 
+0

感謝這個作品,但你在__class_之後缺少了一個_。 – KingFu

+0

沒問題,修正。 –