将Django模型迁移到唯一约束

将Django模型迁移到唯一约束,django,migration,unique-constraint,django-south,Django,Migration,Unique Constraint,Django South,我有一个有三个字段的模型 class MyModel(models.Model): a = models.ForeignKey(A) b = models.ForeignKey(B) c = models.ForeignKey(C) 我想在这些字段之间强制一个唯一的约束,并找到django的unique\u一起,这似乎是解决方案。然而,我已经有了一个现有的数据库,并且有许多重复的数据库。我知道由于unique\u合在一起在数据库级别工作,因此我需要对行

我有一个有三个字段的模型

class MyModel(models.Model):
    a    = models.ForeignKey(A)
    b    = models.ForeignKey(B)
    c    = models.ForeignKey(C)
我想在这些字段之间强制一个唯一的约束,并找到django的
unique\u一起
,这似乎是解决方案。然而,我已经有了一个现有的数据库,并且有许多重复的数据库。我知道由于
unique\u合在一起
在数据库级别工作,因此我需要对行进行unique,然后尝试迁移


有没有一种好方法可以移除重复项(其中重复项具有相同的(a、B、C))以便我可以运行迁移以将
unique\u聚集在一起
contstraint?

如果您愿意任意选择其中一个重复项,我想下面的方法可能会奏效。也许不是最有效但足够简单,我想您只需要运行一次。请在一些测试数据上验证这一切,以防我做了一些愚蠢的事情,因为您将要删除一堆数据

首先,我们找到形成副本的对象组。对于每组,(任意)选择一个我们将保留的“大师”。我们选择的方法是选择具有最低
pk

from django.db.models import Min, Count

master_pks = MyModel.objects.values('A', 'B', 'C'
    ).annotate(Min('pk'), count=Count('pk')
    ).filter(count__gt=1
    ).values_list('pk__min', flat=True)
然后,我们在每个主机上循环,并删除其所有副本

masters = MyModel.objects.in_bulk( list(master_pks) )

for master in masters.values():
    MyModel.objects.filter(a=master.a, b=master.b, c=master.c
        ).exclude(pk=master.pk).del_ACCIDENT_PREVENTION_ete()

您的模型上是否有其他字段(这可能会影响保留哪个副本的选择)?我当时创建了一个\u,它可能是最好的指示器。我们可以在迁移文件本身中执行类似的操作,以避免运行额外的脚本吗?什么是
.del\u incidence\u PREVENTION\u elte()<代码>删除>代码>中间添加“代码>意外事件预防/代码>,以防止人们在不阅读的情况下通过复制/粘贴代码意外删除数据。it@chhantyal只需将其放入迁移文件中。查看Django文档中的数据迁移。我只是做了一个,尽可能简单。