Django模型继承,过滤模型

log*_*ion 3 django django-models django-orm

给出以下模型:(不要介意TextFields只是为了说明)

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')
Run Code Online (Sandbox Code Playgroud)

根据这些定义,Content对象可以与多个Base对象相关联,例如.面试(=内容对象)可以与音乐家(= Child1对象),电影导演(= Child2)等联系.

现在,对于我的问题:是否可以根据aso_items字段指向的模型过滤Content对象?例如:假设我想要一个Queryset,其中包含与Child1的特定对象相关联的所有Content对象(例如,与音乐家Bob Dylan相关的所有访谈),我该如何实现?

此外,如果我想要一个包含与Child1对象相关的所有Content对象的QuerySet,那该怎么办?(例如,所有与音乐家相关的访谈)如何改变过滤?

在此先感谢ps:我在预览中遇到了一些空白问题,原谅我

Mar*_*vin 7

您应该检查Django文档中有关使用related_name抽象基类的部分.http://docs.djangoproject.com/en/dev/topics/db/models/#be-careful-with-related-name

引用文档:

如果related_name 在ForeignKey或ManyToManyField上使用该属性,则必须始终为该字段指定唯一的反向名称.这通常会导致抽象基类出现问题,因为此类中的字段包含在每个子类中,每次都具有完全相同的属性值(包括 related_name).

若要解决此问题,当您在抽象基类(仅)中使用related_name时,名称的一部分应该是字符串%(class)s.这将由使用该字段的子类的低级别名称替换.由于每个类具有不同的名称,因此每个相关名称将最终不同.

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

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()
Run Code Online (Sandbox Code Playgroud)