django4.1 删除重复数据并更新模型为unique

例子

当初设计models的时候,access_key_id 没有设置唯一值,导致有重复数据。现在需要删除重复数据

class Name(models.Model):
    name = models.CharField(max_length=100,unique=True)
    display_name = models.CharField(max_length=100,null=True,blank=True)
    # 其他字段...
    class Meta:
        verbose_name = "名字"
        verbose_name_plural = "名字"

    def __str__(self):
        return self.name
        
class AccessKey(models.Model):
    access_key_id = models.CharField(max_length=50)
    name = models.ForeignKey(Name, on_delete=models.CASCADE)
    # 其他字段...
    class Meta:
        verbose_name = "密钥ID"
        verbose_name_plural = "密钥ID"

    def __str__(self):
        return self.access_key_id  

删除重复数据

如果您希望在删除重复的数据时,每个重复的 access_key_id 值保留一份数据,可以使用以下方法:

duplicate_keys = AccessKey.objects.values('access_key_id').annotate(count=Count('id')).filter(count__gt=1)

for key in duplicate_keys:
    access_keys = AccessKey.objects.filter(access_key_id=key['access_key_id'])
    for i, access_key in enumerate(access_keys):
        if i > 0:
            access_key.delete()

上述代码会查询具有重复 access_key_id 值的记录,并且只保留每个值的第一个记录。通过使用嵌套的循环,在每个重复的 access_key_id 值中遍历记录,并在索引大于 0(即非第一个记录)时,使用 delete() 方法删除多余的记录。

这样就能确保每个重复的 access_key_id 值只保留一份数据,并删除其他重复的记录。

请确保在执行任何数据库操作之前备份数据,以防止意外删除或更改数据。

更改模型

要确保 access_key_id 字段具有唯一的值并删除重复数据,你可以执行以下步骤:

为 access_key_id 字段添加 unique=True 参数,以确保每个 AccessKey 对象的 access_key_id 值是唯一的。你需要修改 AccessKey 模型的定义如下:

class AccessKey(models.Model):
    access_key_id = models.CharField(max_length=50, unique=True)
    name = models.ForeignKey(Name, on_delete=models.CASCADE)
    # 其他字段...
    class Meta:
        verbose_name = "密钥ID"
        verbose_name_plural = "密钥ID"

    def __str__(self):
        return self.access_key_id

运行数据库迁移命令,以应用模型的更改:

python manage.py makemigrations
python manage.py migrate

Django admin管理工具TabularInline表格内联

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

少陽君

谢谢老板的拿铁

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值