Django-访问多个数据库中的值

时间:2019-03-19 10:44:00

标签: python django postgresql

我需要确保一个对象(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的表,其中包含一个ID,一个名称和一些其他字段。

保存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 个答案:

答案 0 :(得分:1)

首先是明显的免责声明:在代码中施加唯一约束是导致混乱和性能低下的秘诀。这就是RDBMS的用途(并且您有几个:)。

也就是说,您当然可以遍历存储设备的每个数据库,并检查是否存在匹配的设备。为此,您必须在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 documentation中有关多个数据库的有用介绍。