首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何与“直通”模型的父模型创建" related_name“关系(关于related_name继承)

如何与“直通”模型的父模型创建" related_name“关系(关于related_name继承)
EN

Stack Overflow用户
提问于 2021-05-08 18:31:04
回答 2查看 17关注 0票数 0

我有4个模型,包括一个M2M“直通”模型,可以有一个索引:

代码语言:javascript
复制
class TargetShape(models.Model):
    pass
    
class Page(models.Model):
    target_shapes = models.ManyToManyField(TargetShape, through='PageElement', related_name='pages')
    
class PageElement(models.Model):
    target_shape = models.ForeignKey(TargetShape, related_name='page_elements')
    page = models.ForeignKey(Page, related_name='page_elements')
    index = models.PositiveIntegerField(verbose_name='Order')
    

class WorkingSession(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='working_sessions')

我定义了另一个模型Resolution,它使我能够将它们全部链接在一起,以便创建以下related_name关系:

代码语言:javascript
复制
working_session.resolutions
user.resolutions
target_shape.resolutions
page.resolutions
page_element.resolutions

要让它正常工作,我必须声明:

代码语言:javascript
复制
class Resolution(models.Model):
    # relations that would be needed from a DRY perspective:
    page_element = models.ForeignKey(PageElement, related_name='resolutions')
    working_session = models.ForeignKey(WorkingSession, related_name='resolutions')
    
    # relations I want to exist to use user.resolutions, target_shape.resolutions, page.resolutions: 
    user = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='resolutions')
    target_shape = models.ForeignKey(TargetShape, related_name='resolutions')
    page = models.ForeignKey(Page, related_name='resolutions')

然而,这并不是很枯燥。从DRY的角度来看,我应该能够将Resolution声明为仅链接到PageElementWorkingSession,并推导/继承与父模型的关系:

代码语言:javascript
复制
class Resolution(models.Model):
    page_element = models.ForeignKey(PageElement, related_name='resolutions')
    working_session = models.ForeignKey(WorkingSession, related_name='resolutions')

但在这种情况下,我如何创建以下关系:

代码语言:javascript
复制
user.resolutions
target_shape.resolutions
page.resolutions

不经过以下步骤:

代码语言:javascript
复制
user.working_sessions.resolutions
target_shape.page_elements.resolutions
page.page_elements.resolutions
EN

回答 2

Stack Overflow用户

发布于 2021-05-08 18:31:21

我所能想到的就是:

  • 要么像

那样声明所有字段

  • 或在用户、TargetShape和页面中声明分别返回以下属性的属性:

Resolution.objects.filter(working_session__user=self) Resolution.objects.filter(page_element__target_shape=self) Resolution.objects.filter(page_element__page=self)

那当然可以,但那不是很优雅...也不是很像姜戈人

有没有人知道更像Django的方式来定义这种关系?

票数 0
EN

Stack Overflow用户

发布于 2021-11-03 17:01:15

我发现了另一种方法:在用户、TargetShape和页面中声明一个返回查询集的属性:

代码语言:javascript
复制
class Resolution(models.Model):
    page_element = models.ForeignKey(PageElement, related_name='resolutions')
    working_session = models.ForeignKey(WorkingSession, related_name='resolutions')

class PageElement(models.Model):
    target_shape = models.ForeignKey(TargetShape, related_name='page_elements')
    page = models.ForeignKey(Page, related_name='page_elements')
    index = models.PositiveIntegerField(verbose_name='Order')
    

class WorkingSession(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='working_sessions')



class TargetShape(models.Model):
    @property
    def resolutions(self):
        return Resolution.objects.filter(page_element__target_shape=self) 

    
class Page(models.Model):
    @property
    def resolutions(self):
        return Resolution.objects.filter(page_element__page=self)

    target_shapes = models.ManyToManyField(TargetShape, through='PageElement', related_name='pages')
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67446545

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档