如何处理 Django 模型中的循环关系?

Posted

技术标签:

【中文标题】如何处理 Django 模型中的循环关系?【英文标题】:How to deal with circular relationship in Django models? 【发布时间】:2022-01-18 02:38:30 【问题描述】:

我正在尝试编写一个基本数据库来提供我的照片。这看起来很简单,但我就是想不通,尽管思考了几个星期。我正在尝试组合多个相互链接的模型。

照片:包含一些存储数据的文件人物:照片中出现的有关某人的数据/已引起了引用 引言:某人说过的话需要附在照片上(引言不属于那个人的所有照片,而是属于特定的一组照片) 优惠:包含所有报价的概览,其中一张照片作为缩略图和所有照片(有些照片可能有相同的报价,但应该只出现一次)

作为一个模型,因为这里的人们真的很喜欢先看一些代码,所以我做了这个:

class Quote:
    person = models.ForeignKey("Person")
    photos = models.ManyToManyField("Photo")
    
class Person:
    photo = models.ForeignKey("Photo")
    
class Photo:
    pass
    
class Offer:
    quotes = models.ManyToManyField("Quote")
    photos = models.ManyToManyField("Photo")

请以上面的代码为例,因为我已经不知道如何解决这个问题。我尝试了多个不同的版本,但总有一些情况没有被涵盖。在上面的示例中,问题是:Person 和 Quote 独立地附加到 Photos。但是如果没有那个人在那里,就不可能有报价。所以有些信息是加倍的,可能会不同意。我也尝试使用“through=”将 People 和 Quotes 放在一起,但后来遇到了其他问题。

你能推荐任何好的教程或给我一个提示如何处理这些“混乱”的关系吗?

谢谢你, 迈克尔

【问题讨论】:

【参考方案1】:

希望我做对了。下图显示了我将如何设置此类结构。

人物:每个人都有多个引号,并且是多张照片的一部分 照片:每张照片都是多个照片集的一部分 引用:每条引用引用一张照片集 Photoset_Photos: 多对多结构将多个照片集与多张照片连接起来 照片集:每个照片集确实包含多张照片,并且可以用多个引号引用 报价:一个报价引用多个照片集,通过此参考,您可以获得他们的照片集和所有照片的所有报价

【讨论】:

以上是关于如何处理 Django 模型中的循环关系?的主要内容,如果未能解决你的问题,请参考以下文章

如何处理淘汰视图模型中的多对多关系

您如何处理模型类中的外键关系

Django Fixtures 如何处理 ManyToManyFields?

如何处理循环引用 - 或 - 在 WCF 服务中返回的第一级子项下的引用暴露实体框架数据模型?

如何处理局部视图中的模型

如何处理 django-rest-framework 中 url 模式中的外键关系