【问题标题】:How to create 3 way ManyToMany relationship django如何创建 3 路多对多关系 django
【发布时间】:2017-03-27 08:11:49
【问题描述】:

需要在 django admin 中建模服务器、应用程序和服务器角色之间的关系。

  • 服务器可以有一个许多应用程序
  • 应用程序可以托管在一个许多服务器上
  • 服务器具有一个或多个应用程序角色(数据库服务器角色, WEB服务器角色等)
    • 即:ServerA 具有 AppX 的角色(Web 服务器和 Db 服务器,2 个角色)
    • 服务器 A 具有 AppY 的(Web 服务器)角色

ServerRole下面的代码是中介模型

这就是我的想法。到目前为止它运行良好,但我错过了什么吗?

class Application(models.Model):
    name = models.CharField(max_length=200)

    def __unicode__(self):
        return self.name

class Server(models.Model):
    name = models.CharField(max_length=200)
    apps = models.ManyToMany('Application', related_name='servers')

class ServerRole(models.Model):
    name = models.CharField(max_length=200)
    servers = models.ManyToMany(Server, related_name='serverrole')

【问题讨论】:

    标签: django database-design django-admin


    【解决方案1】:

    如果我正确理解了您的要求,这更像是您所需要的

    class ServerRole(models.Model):
        name = models.CharField(max_length=200)
    
    class Application(models.Model):
        name = models.CharField(max_length=200)
    
        def __unicode__(self):
            return self.name
    
    class Server(models.Model):
        name = models.CharField(max_length=200)
        apps = models.ManyToMany('Application', through='ServerRole', related_name='servers')
    

    Rational - 一个服务器可以有很多应用程序,一个应用程序可以有很多服务器。如果一个应用在特定的服务器上,它应该只有一个角色(如果不是你的整个系统,因为非常复杂和难以编写)可以通过多对多关系中的直通模型实现。

    【讨论】:

    • 试图了解您的代码和我的代码之间的区别。你的第二句话说:如果一个应用程序在一个特定的服务器上,它应该只有一个角色。不是这种情况。对于一个特定的应用程序,一台服务器可能具有多个角色。例子。服务器 A 可能具有 Web 服务器的角色 + 一个特定应用程序的代理服务器的角色。 SAME 服务器 A 可能充当 APP B 的代理服务器。这就是为什么我的代码工作正常的原因。但也许我错了。想法?
    • 是的,我也是这个意思。如果国际象棋应用在服务器 A 上,它应该是代理。但是,您不能在服务器 A 上拥有另一个国际象棋应用程序实例,其中服务器 A 充当 redis 缓存。
    • 顺便说一句,与您的项目无关。作为数据库的服务器应该只是一个数据库。不应向其开放其他端口。此外,数据库的硬件配置恰好与 Web 服务器、memcache 或 redis 非常不同。所以他们真的不应该在高流量的环境中成为万事通。
    • 同意你的例子。将尝试您的代码,看看它与我已有的代码有何不同(如上例所示)。在你的第二点。我同意你的看法。更像是,对于一个 appA,A 服务器既是 FTP 又是 WEB,而对于 AppB,服务器既是 FTP 又是 Web。我很想知道您的代码与我的代码有何不同。你有服务器模型作为中介,我有中介角色。还有什么我想念的吗?
    • 唯一的另一件事是尝试使用 SFTP 而不是 FTP
    猜你喜欢
    • 1970-01-01
    • 2020-09-28
    • 2011-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多