Django模型继承、筛选模型

Django模型继承、筛选模型,django,django-models,django-orm,Django,Django Models,Django Orm,考虑到以下模型:不要介意文本字段,它们只是为了说明 class Base(models.Model): field1 = models.TextField() class Meta: abstract=True class Child1(Base): child1_field = models.TextField() class Child2(Base): child2_field = models.TextField() class Content

考虑到以下模型:不要介意文本字段,它们只是为了说明

class Base(models.Model):
   field1 = models.TextField()

   class Meta:
      abstract=True

class Child1(Base):
   child1_field = models.TextField()

class Child2(Base):
   child2_field = models.TextField()


class Content(models.Model):
    aso_items = models.ManyToManyField('Base')
根据这些定义,内容对象可以与多个基本对象相关联,例如访谈=内容对象可以与音乐家=儿童1对象、电影导演=儿童2等相关联

现在,我的问题是: 是否可以根据aso_items字段指向的模型过滤内容对象? 例如:假设我想要一个Queryset,其中包含与Child1eg的特定对象关联的所有内容对象。所有与音乐家鲍勃·迪伦有关的采访,我如何才能做到这一点

此外,如果我想要一个包含所有与Child1对象相关联的内容对象的查询集呢?例如,所有与音乐家相关联的采访 这将如何改变过滤

提前谢谢
ps:我在预览中遇到了一些空白问题,请原谅我

显然,不允许使用ForeignKey关系或许多抽象类。 我得到以下错误:“AssertionError:ForeignKey无法定义与抽象类Artiest的关系”

一种可能的解决方案是将基类定义为非抽象类,但是这意味着可以实例化基类的模型。这不是我想要的行为。毕竟它是一个抽象类 有人遇到同样的问题吗?你是怎么解决的?有其他选择吗?

看看哪些是通过泛型关系进行的。您的内容模型将与他们的TaggedItem模型相匹配,并且您的基础模型将与他们的动物/植物/矿物模型(Child1和Child2)相匹配

为单个子级获取所有内容对象将假定您将GenericRelation设置为Base内的内容:

child_contents = childObject.contents.all()
要获取模型的所有内容对象,请执行以下操作:

ctype = ContentType.objects.get_for_model(Child1)
all_child_contents = Content.objects.filter(content_type=ctype)

您应该查看Django文档中关于为抽象基类使用相关_名称的部分

引用文件:

如果您使用的是相关的_名称 外键上的属性或 曼尼托曼尼菲尔德,你必须永远 为该文件指定唯一的反向名称 领域这通常会导致 抽象基类中的问题, 因为这个类上的字段是 包括在每个孩子身上 类,具有完全相同的值 对于属性,包括 每次都有相关的名字

为了解决这个问题,当你 在摘要中使用相关的名称 仅基类,名称的一部分 应该是字符串%s。这 替换为的小写名称 使用该字段的子类 在里面因为每个班级都有不同的课程 名称,每个相关的名称将结束 与众不同

使用此信息,我建议将m2m字段移动到基类中:

class Content(models.Model):
   # Add remaining fields for Content 
   pass

class Base(models.Model):
   field1 = models.TextField()
   items = models.ManyToManyField(Content,related_name="%(class)s_related")

   class Meta:
      abstract=True

class Child1(Base):
   child1_field = models.TextField()

class Child2(Base):
   child2_field = models.TextField()

如果内容模型不是抽象的,那么这是一个很好的解决方案。如果内容模型也是抽象的,那么它将不再工作。但这与我发布的内容完全不同。在两者都是抽象的情况下,我认为您必须使用Adam建议的ContentType框架。这可能就是我所寻找的,支持使用泛型关系的ContentType框架在中有文档记录。Django.contrib.comments中的comments应用程序标准使用此框架,因此提供了可用的示例代码。我现在正在研究它。我担心性能,我们的网站每天获得约11k点击率,我希望我的解决方案可以随意扩展。点击率可能会上升。例如,有人能解释一下这个问题吗?生产服务器将在主机的VPS上运行。