【问题标题】:Access child model class attributes in multi table inheritance in Django在Django的多表继承中访问子模型类属性
【发布时间】:2017-07-11 07:04:11
【问题描述】:

我正在尝试在模板中迭代子模型实例的属性,特别是我只想访问子模型的属性。在运行时,我不知道它是什么具体的子类。使用django-model-utils 我已经能够返回子类而不是父类,这是一个开始,但是当我访问它的属性时,我得到了父类返回的子类:

    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 %}

【问题讨论】:

  • 不应该是这样吗?一个child继承了parent的属性,所以Product属性比如created_at也会显示出来是正常的吧?
  • @LaundroMat 我假设是这样,但如果可能的话,我正试图找到一种仅返回孩子属性的方法
  • 好吧 :) 也许这个答案可以让你上路? stackoverflow.com/questions/7136154/…
  • @LaundroMatthanks 这很有帮助,` __class__` 是我想念的秘诀

标签: python django django-model-utils


【解决方案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

【讨论】:

  • 感谢这项工作,但您在“_class”之后缺少一个 _。
  • 没问题,已修复。
猜你喜欢
  • 2019-05-13
  • 1970-01-01
  • 2019-03-08
  • 2015-03-05
  • 2017-02-11
  • 2015-08-11
  • 2017-09-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多