python - 使用 Django Delete 删除对象
问题描述
我在从数据库中删除一个对象时遇到问题,我有一个代码从 AWS 获取 RDS 主机名列表,然后将存储在我的数据库中的 rds 主机名与 AWS 返回的主机名进行比较,如果 rds 主机名存储在我的数据库而不是由 AWS 返回它应该从我的数据库中删除,但我的代码最终会删除存储在我的数据库中的所有 RDS 主机名
这是我的模型
class AwsAssets(BaseModel):
aws_access_token = models.CharField(max_length=512, blank=True, null=True)
aws_secret_token = models.CharField(max_length=512, blank=True, null=True)
rds_count = models.IntegerField(blank=True, null=True)
def __str__(self):
return '{} - {}'.format(
self.client_aws_access_token,
self.client_aws_secret_token
)
class Meta:
verbose_name_plural = "Aws Assets"
class AwsRdsNames(BaseModel):
host = models.CharField(max_length=300, null=True, blank=True)
port = models.IntegerField(null=True, blank=True)
asset_link = models.ForeignKey(AwsAssets, null=True, blank=True,
related_name="rds_endpoints", on_delete=models.CASCADE
)
region = models.CharField(max_length=56, null=True, blank=True)
scan_status = models.NullBooleanField(default=None)
last_scan = models.DateTimeField(null=True, blank=True)
def __str__(self):
return "{}:{}".format(self.host, self.port)
class Meta:
db_table = 'aws_rds_names'
ordering = ['-id']
然后这里是负责删除 rds 主机名的代码块
all_stored_rds = AwsRdsNames.objects.all()
stored_rds = all_stored_rds.filter(asset_link=self.asset) #This returns all the stored rds hosts in db
aws_rds = get_rds() #This returns a list of rds hostname from aws
for rds in stored_rds:
if rds.host not in aws_rds:
AwsRdsNames.objects.filter(host=rds.host).delete()
此代码最终删除了存储在我的数据库中的所有 rds 主机,而不是删除 aws 未返回的主机
解决方案
假设您有一个包含现有域名称的列表:
domains = ["domain1", "domain2", "domain3", ...]
for entry in AwsRdsNames.objects.all():
if entry.host not in domains:
entry.delete()
应该这样做。
推荐阅读
- ruby-on-rails - 为什么我的 Rails 应用程序打不开?即使我使用命令($ heroku config:set ~ 等)设置了环境变量 'SECRET_KEY_BASE'
- python - 出现错误 AttributeError:“str”对象没有属性“strftime”
- html - 表中的目标迭代 fa-icon 行 - Angular,primeNg
- postgresql - 更新 HasMany 关联失败的 Gorm
- php - 为什么要在 PHP 中使用“use”关键字来导入核心标识符?
- php - PHP 版本从 5.6 升级到 7.4 导致 mbstring.func_overload = 6 出现问题
- php - 如何使 Emmet 在 VSCode 的 php 文件中的引号内工作?
- javascript - 将 Javascript 变量传递给 Django 标签
- android - 以编程方式检测 Samsung KNOX 支持的设备
- java - 原因:无效的条目大小(预期为 29338,但得到了 26629 字节)