我正在使用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')
答案 0 :(得分:1)
如果它不是抽象的,那么你可能不得不以肮脏的方式去做。 Django文档显示,如果您使用一对多链接,您基本上可以查询所有内容。因为情况并非如此,脏路可能是唯一的方法。我没有用足够的Django直接告诉你。
我建议你看一下django书,http://www.djangobook.com/en/2.0/
这本书有这一切。当我在一个月前编写django服务器时,这成了我的一站式商店参考。
我希望这会有所帮助。