Django,与抽象实体的多通关系

2024-09-29 02:21:49 发布

您现在位置:Python中文网/ 问答频道 /正文

假设object在数组中包含多种类型的对象(Models),如Page,可以包含PostBlogPicture,数量或顺序任意,用户向下滚动并看到以下元素,根据page,下一个元素是这些类型的元素之一。因此Page可以包含:

  1. A Post
  2. A Post
  3. A Picture

或者一些完全不同的东西,比如:

  1. A Picture
  2. A Blog
  3. A 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_setblog_setpicture_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实例的顺序集,并且能够拥有所需的顺序


Tags: 对象name元素for顺序modelspageblog
1条回答
网友
1楼 · 发布于 2024-09-29 02:21:49

由于您希望按顺序查询多个模型,并且您可以看到您的模型处于Model is a PageElement关系中,因此您需要一个OneToOneField公共模型,而不是从抽象模型继承:

class PageElement(models.Model):
    POST = 'PO'
    BLOG = 'BL'
    PICTURE = 'PI'
    ELEMENT_TYPE_CHOICES = [
        (POST, 'Post'),
        (BLOG, 'Blog'),
        (PICTURE, 'Picture'),
    ]
    element_type = models.CharField(
        max_length=2,
        choices=ELEMENT_TYPE_CHOICES,
        default=POST,
    )
    # common fields

class Post():
    page_element = models.OneToOneField(
        PageElement,
        on_delete=models.CASCADE,
        related_name = "post"
    )

class Blog():
    page_element = models.OneToOneField(
        PageElement,
        on_delete=models.CASCADE,
        related_name = "blog"
    )

class Picture():
    page_element = models.OneToOneField(
        PageElement,
        on_delete=models.CASCADE,
        related_name = "picture"
    )

如果需要的话,可以从具有OneToOneField的公共抽象类继承

相关问题 更多 >