在没有外键关系的 Django 中加入两个不同的模型,一个 'unmanaged'

Join Two Different Models, One 'unmanaged', in Django Without a Foreignkey Relation

我有以下两个 Django 模型:

class Project(models.Model):
  identifier = models.CharField(max_length=128)
  target_value = models.CharField(max_length=64)
  ...

  Meta:
    managed='False'
    db_table='projects'

class MainProjects(models.Model):
  mp_identifier = models.CharField(max_length=128)
  some_value = models.CharField(max_length=256)
  ...

包含 Project 模型的数据库实际上在某处的云数据库中关闭,实际上由一个单独的团队编写的完全不同的应用程序使用。我需要能够让 Django 提取 MainProjects 的列表,并以某种方式将 Project 模型中的 target_value 注释到 QuerySet 中。

我试过使用 .extra(),但文档很薄,到目前为止我能找到的示例对我不起作用。如果可能的话,我也想避免使用原始 SQL。

现在,我通过使用为 Django 应用程序编写的管理命令从远程数据库中获取 target_value 并将其存储为 MainProjects 模型来解决这个问题属性,这样我就可以在本地引用它但是 - 糟糕。

想法?建议?

我建议您通读文档的这一部分。

https://docs.djangoproject.com/en/4.0/ref/models/options/#django.db.models.Options.managed

它详细解释了托管选项。

此外,当涉及到连接到不同的数据库时,您可以根据需要设置任意数量的数据库连接,并在 settings.py 文件中指定它们。

大多数 sql 服务器的工作方式是通过 TCP 或套接字。但是,我会尽可能推荐套接字,因为您需要连接到远程服务器,通过 TCP 连接可能更容易。

知道您可以输入任何 IP 地址、端口、用户名、密码等,并能够连接到托管 sql 服务器的该地址的服务器,这就是知道相关连接信息然后告诉 django 的事情。例如:

DATABASES = {
    'remote_unmanaged': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': '[the database name]',
        'USER': '[the database user with remote access privilege]',
        'PASSWORD': '[password for user above]',
        'HOST': '[server ip address]',
        'PORT': '',
    }
}

此外,要使用来自远程连接服务器的查询集,您可以在此处查看:

https://docs.djangoproject.com/en/4.0/topics/db/multi-db/#manually-selecting-a-database-for-a-queryset

我刚刚注意到关于您模型上元对象的另一件事:

class Project(models.Model):
    identifier = models.CharField(max_length=128)
    target_value = models.CharField(max_length=64)
    
    class  Meta:
        managed=False # <-- here, literal False, not str which was truth, which means it was actually considered a managed model :)
        db_table='projects'