Объединение двух разных моделей, одна из которых "неуправляемая", в 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': '',
    }
}

Кроме того, чтобы использовать набор запросов с вашего сервера удаленного подключения, вы можете посмотреть здесь:

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'
Вернуться на верх