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

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

例子

当初设计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表格内联

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: go