使用Django查询Base Model时查找SubModel实例

时间:2014-02-05 13:15:41

标签: django django-models

考虑以下模型:

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

在查询基础对象时是否有正确的方法来确定实例类型,如本例所示?

2 个答案:

答案 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