Django - доступ к значениям в нескольких базах данных - PullRequest
0 голосов
/ 19 марта 2019

Мне нужно убедиться, что объект (Device) сохраняется только один раз и только в одну базу данных.

У меня есть несколько баз данных PostGre SQL:

                                       List of databases
             Name              | Owner | Encoding |  Collate   |   Ctype    | Access privileges 
-------------------------------+-------+----------+------------+------------+-------------------
 admin                         | admin | UTF8     | en_US.utf8 | en_US.utf8 | 
 postgres                      | admin | UTF8     | en_US.utf8 | en_US.utf8 | 
 reference                     | admin | UTF8     | en_US.utf8 | en_US.utf8 | 
 template0                     | admin | UTF8     | en_US.utf8 | en_US.utf8 | =c/admin         +
                               |       |          |            |            | admin=CTc/admin
 template1                     | admin | UTF8     | en_US.utf8 | en_US.utf8 | =c/admin         +
                               |       |          |            |            | admin=CTc/admin
 workspace_A                   | admin | UTF8     | en_US.utf8 | en_US.utf8 | 
 workspace_B                   | admin | UTF8     | en_US.utf8 | en_US.utf8 | 
 workspace_C                   | admin | UTF8     | en_US.utf8 | en_US.utf8 | 
 workspace_D                   | admin | UTF8     | en_US.utf8 | en_US.utf8 | 

Рабочие пространства A, B, C и D имеют таблицу с именем devices_device, которая содержит идентификатор, имя и некоторые другие поля.

Какие функции мне нужно вызывать при сохранении Device (переписывание функции Django save()), чтобы убедиться, что Device с такими же параметрами еще не существует?

Это то, что я сейчас выделил, с вопросительными знаками, где я не знаю, какую функцию использовать

def save(self, *args, **kwargs):
    for tab in ?.objects.all():
        if tab.object.using('devices_device')? == self.device_reference
        and ?.device_name == self.device_name
        and  ?.device_address == self.device_address
        and  ?.device_position== self.device_position
        and  ?.device_desciption == self.device_desciption:
            raise ValidationError(
                "This device already exists in another workspace!"
            )
    super().save(*args, **kwargs)

1 Ответ

1 голос
/ 19 марта 2019

Сначала очевидный отказ от ответственности: наложение уникальных ограничений в коде - это рецепт хаоса и низкой производительности.Вот для чего нужны СУБД (а у вас их несколько :).

Тем не менее, вы, конечно, можете зацикливаться на каждой из баз данных, где хранятся устройства, и проверять наличие соответствующего устройства.Чтобы это работало, вы должны включить каждую базу данных в settings.DATABASES.

from django.conf import settings

for db in settings.DATABASES:
    if YourModel.objects.using(db).filter(
        # add your filter conditions here
    ).exists():
        raise ValidationError(
            "This device already exists in another workspace!"
        )            

. Полагаю, вы уже прочитали полезное введение в несколько баз данных в документации Django .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...