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:我在预览中遇到了一些空白问题,原谅我
您应该检查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)
| 归档时间: |
|
| 查看次数: |
4741 次 |
| 最近记录: |