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

时间:2011-06-02 06:01:01

标签: 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)
   ...
   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管理屏幕上保存对象时,它将我的通用字段的content_type设置为等于PostWithImage。但是,如果我现在要检索具有特定标记的所有帖子(无论它们是BasicPost,PostWithImage还是任何其他类型的帖子),我都会遇到问题。没有简单的查询可以做到这一点,因为标签指向一堆不同的模型。我找到了一个解决方法,但它非常难看(见下文)。

我的问题是:有没有办法可以强制管理界面保存标签,其中content_type指向基类,即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')

1 个答案:

答案 0 :(得分:1)

如果它不是抽象的,那么你可能不得不以肮脏的方式去做。 Django文档显示,如果您使用一对多链接,您基本上可以查询所有内容。因为情况并非如此,脏路可能是唯一的方法。我没有用足够的Django直接告诉你。

我建议你看一下django书,http://www.djangobook.com/en/2.0/

这本书有这一切。当我在一个月前编写django服务器时,这成了我的一站式商店参考。

我希望这会有所帮助。