我需要确保一个对象(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)
答案 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中有关多个数据库的有用介绍。