假设object在数组中包含多种类型的对象(Models
),如Page
,可以包含Post
、Blog
、Picture
,数量或顺序任意,用户向下滚动并看到以下元素,根据page
,下一个元素是这些类型的元素之一。因此Page
可以包含:
Post
Post
Picture
或者一些完全不同的东西,比如:
Picture
Blog
Picture
元素可以是一个抽象实体,其属性为ForeignKey
,将自身与Page
关联,其继承将获得对该关系的访问权:
class Page(models.Model):
...
class PageElement(models.Model):
page = models.ForeignKey(Page, verbose_name="Page", on_delete=CASCADE)
class Meta:
abstract = True
class Post(PageElement):
...
class Blog(PageElement):
...
class Picture(PageElement):
...
使用这种方法,您可以使用REST序列化程序序列化Page
,但是您没有访问pageElement_set
的权限,相反,您需要调用post_set
、blog_set
、picture_set
并取消对象的顺序
通过在ForeignKey
中添加related_name
键,我们得到一个错误:
pages.Picture.page: (fields.E305) Reverse query name for 'Picture.page' clashes with reverse query name for 'Post.page'.
HINT: Add or change a related_name argument to the definition for 'Picture.page' or 'Post.page'.
问题是:您如何在Django实现这种关系?
这样您就可以拥有PageElement
实例的顺序集,并且能够拥有所需的顺序
由于您希望按顺序查询多个模型,并且您可以看到您的模型处于
Model is a PageElement
关系中,因此您需要一个OneToOneField
公共模型,而不是从抽象模型继承:如果需要的话,可以从具有
OneToOneField
的公共抽象类继承相关问题 更多 >
编程相关推荐