Объединение двух разных моделей, одна из которых "неуправляемая", в Django без отношения иностранных ключей
У меня есть следующие две модели 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)
...
<<<База данных, в которой хранится модель , находится где-то в облачной базе данных и используется совершенно другим приложением, написанным отдельной командой. Мне нужно иметь возможность попросить Django получить список Project
и каким-то образом аннотировать MainProjects
из модели target_value
в QuerySet.Project
Я пытался использовать .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': '',
}
}
Кроме того, чтобы использовать набор запросов с вашего сервера удаленного подключения, вы можете посмотреть здесь:
Еще одна вещь, которую я только что заметил в одном из мета-объектов вашей модели:
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'