考虑以下模型:
class Content(models.Model):
...
class ContentText(Content):
...
class ContentRichText(Content):
...
查询基本模型时:
listContent = Content.objects.all()
for content in listContent:
#if content is ContentText:
#do stuff
#elif content is ContentRichText:
#do other stuff
在查询基础对象时是否有正确的方法来确定实例类型,如本例所示?
答案 0 :(得分:1)
我找到了以下方法(部分使用我现在找不到的SO帖子)
#Models
class ContentType(models.Model):
name = models.CharField(max_length=255)
class Content(models.Model):
contentType = models.ForeignKey(ContentType,null=True,blank=True)
...
class ContentText(Content):
...
def save(self, *args, **kwargs):
if not self.pk:
self.contentType = ContentType.objects.get(name='ContentText')
super(ContentText, self).save(*args, **kwargs)
class ContentRichText(Content):
...
def save(self, *args, **kwargs):
if not self.pk:
self.contentType = ContentType.objects.get(name='ContentRichText')
super(ContentRichText, self).save(*args, **kwargs)
模型保存方法被覆盖,在创建时设置contentType。
现在可以做这样的事情:
表示listContent中的内容: if(content.contentType.name =“ContentText”): #做东西 if(content.contentType.name =“ContentRichText”): #do其他的东西
不确定这是最简单,最清洁的方法......
答案 1 :(得分:0)
Django-model-utils是您的朋友,请阅读django-model-utils inheritance docs,了解您的情况:
listContent = Content.objects.all().select_subclasses()
for content in listContent:
if isinstance( content, ContentText):
#do stuff
elif isinstance( content, ContentRichText):
#do other stuff
此外,您是否可以了解django-polymorphic项目以满足您的要求。
有关完整列表,请参阅Model inheritance django packages。