首页 > 解决方案 > 使用 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 未返回的主机

标签: pythondjangoamazon-web-servicesdjango-models

解决方案


假设您有一个包含现有域名称的列表:

domains = ["domain1", "domain2", "domain3", ...]
for entry in AwsRdsNames.objects.all():
   if entry.host not in domains:
       entry.delete()

应该这样做。


推荐阅读