Django按属性子类过滤查询集

时间:2015-05-23 13:03:51

标签: django django-queryset django-inheritance

我有一个Slug模型来识别Page个对象。 BlogPost继承自Page。我希望BlogPost找到一个Slug名称,但没有其他Page个对象。

编辑:添加模型

class Slug(models.Model):
    name = models.CharField()
    page = models.ForeignKey('Page', null=True)

class Page(models.Model):
    slug = models.OneToOneField('Slug', related_name='primary_slug_set')
    content = models.TextField()

class BlogPost(Page):
    time = models.DateTimeField(auto_now_add=True, editable=False)

我想我是这样的:

Slug.objects.get(name=slug_name).filter(page=subclass_of(BlogPost))

我知道InheritanceManagerselect_subclasses(BlogPost),但我的查询是针对Slug的,所以除非我查询{{1,否则我无法看到这会有所帮助用我的slug寻找Page(这是一个更好的方法吗?)。

而不是过滤器我可以遍历所有slug结果并手动检查每一个。通过检查BlogPost页面是否具有任何Slug属性,the way to do this似乎是http://fmpp.sourceforge.net/qtour.html#sect4。最多只会有一些小块冲突需要筛选,很少会发生任何冲突。

我有没有办法让数据库查询为我做过滤?

2 个答案:

答案 0 :(得分:0)

如果您的Slug模型以下列方式定义与Pages的关联:

class Slug(models.Model):
...
    content_type = models.ForeignKey(ContentType)
    object_id = models.PositiveIntegerField()
    page = generic.GenericForeignKey('content_type', 'object_id')

然后,您的查询应如下所示:

content_type = ContentType.objects.get_for_model(BlogPost)
Slug.objects.filter(name=slug_name, content_type__pk=content_type.id)

答案 1 :(得分:0)

Haven没有对此进行测试,但试一试:

AsyncTask