Django管理员是否可以配置为使用继承模型的基本模型id保存通用内容类型?

Django管理员是否可以配置为使用继承模型的基本模型id保存通用内容类型?,django,inheritance,django-admin,Django,Inheritance,Django Admin,我正在使用Django 1.3 我有一个名为BasicPost的基本模型(不是抽象模型)。我有一个从中继承的模型,叫做PostWithImage。BasicPost有几个通用关系 在models.py中: class BasicPost(models.Model): ... authors = generic.GenericRelation(OrderedCredit, verbose_name=_('authors'), blank=True, null=True) .

我正在使用Django 1.3

我有一个名为BasicPost的基本模型(不是抽象模型)。我有一个从中继承的模型,叫做PostWithImage。BasicPost有几个通用关系

在models.py中:

class BasicPost(models.Model):
   ...
   authors = generic.GenericRelation(OrderedCredit,
   verbose_name=_('authors'), blank=True, null=True)
   ...
   tags = generic.GenericRelation(TaggedItem, verbose_name=_('tags'),
                                  blank=True, null=True)
   ...

class PostWithImage(BasicPost):
   ...
在admin.py中:

class TaggedItemInline(generic.GenericTabularInline):
    ...
    model = TaggedItem
    ...

class OrderedCreditInline(generic.GenericTabularInline):
    ... # same concept as above

class BasicPostAdmin(admin.ModelAdmin):
    inlines = [OrderedCreditInline, TaggedItemInline]

class PostWithImageAdmin(BasicPostAdmin):
    ...
当我在PostWithImage管理屏幕上保存对象时,它会将我的通用字段的内容类型设置为PostWithImage。但是,如果我现在想检索所有带有特定标记的帖子(不管它们是BasicPost、PostWithImage还是任何其他类型的帖子),我会遇到问题。没有简单的查询可以做到这一点,因为标记指向一组不同的模型。我已经找到了一个解决办法,但它非常难看(见下文)

我的问题是:是否有一种方法可以强制管理接口保存内容类型指向基类(即BasicPost)的标记?

这是一个丑陋的解决办法。程序员很难破译 我怀疑它会产生非常昂贵的数据库点击量

class BasicPost(models.Model)

   # This code uses model_utils select_subclasses method

   def get_related_posts(self):
      tags = self.tags.all()

      return BasicPost.objects.filter(
        pk__in=
            [t.object_id for t in
                TaggedItem.objects.filter(tag__name__in=[t.tag.name for t in tags])
                    if isinstance(t.content_type.model_class()(), BasicPost)])\
                        .select_subclasses().order_by('-date_published')

如果它不是抽象的,那么你可能不得不用肮脏的方式来做。Django文档显示,如果使用一对多链接,基本上可以查询所有内容。因为事实并非如此,肮脏的方式可能是唯一的方式。我还没有用足够的Django来马上说出来

我建议你看看django的书

这本书包罗万象。一个月前,当我编写django服务器时,这成为了我的一站式参考


我希望这能有所帮助。

如果不是抽象的,你可能不得不用肮脏的方式来做。Django文档显示,如果使用一对多链接,基本上可以查询所有内容。因为事实并非如此,肮脏的方式可能是唯一的方式。我还没有用足够的Django来马上说出来

我建议你看看django的书

这本书包罗万象。一个月前,当我编写django服务器时,这成为了我的一站式参考

我希望这有帮助