<p>您的<code>type()</code>方法不起作用,因为您使用的是<a href="https://docs.djangoproject.com/en/1.9/topics/db/models/#multi-table-inheritance" rel="nofollow">multi-table inheritance</a>:<code>ProductRow</code>的每个子级都是一个独立的模型,使用自动生成的<a href="https://docs.djangoproject.com/en/1.9/topics/db/examples/one_to_one/" rel="nofollow">^{<cd4>}</a>连接到{<cd2>}。在</p>
<ul>
<li><p>如果您确保每个<code>ProductRow</code>实例只有一种类型的子实例(三种可能的类型中的一种),那么有一种简单的方法来确定该子实例是<code>ProductBanner</code>、<code>ProductMagazineRow</code>还是<code>ProductTextGridRow</code>,然后使用适当的字段:</p>
<pre><code>class ProductRow(models.Model):
...
def get_type(self):
try:
self.productbanner
return 'product-banner'
except ProductBanner.DoesNotExist:
pass
try:
self.productmagazinerow
return 'product-magazine'
except ProductMagazineRow.DoesNotExist:
pass
try:
self.producttextgridrow
return 'product-text-grid'
except ProductTextGridRow.DoesNotExist:
pass
return 'generic'
</code></pre></li>
<li><p>但是,如果不强制执行,则<code>ProductRow</code>的一个实例可以同时链接到<code>ProductBanner</code>、<code>ProductMagazineRow</code>和{<cd8>}中的多个。您将不得不使用特定实例:</p>
<pre><code>class ProductRow(models.Model):
...
def get_productbanner(self):
try:
return self.productbanner
except ProductBanner.DoesNotExist:
return None
def get_productmagazinerow(self):
try:
return self.productmagazinerow
except ProductMagazineRow.DoesNotExist:
return None
def get_producttextgridrow(self)
try:
return self.producttextgridrow
except ProductTextGridRow.DoesNotExist:
return None
</code></pre></li>
</ul>
<p>结合Antonio Pinsard的回答来改进数据库设计。在</p>