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上运行。