我有一个有三个字段的模型
class MyModel(models.Model):
a = models.ForeignKey(A)
b = models.ForeignKey(B)
c = models.ForeignKey(C)
我想在这些字段之间强制执行唯一约束,并找到django的unique_together
,这似乎是解决方案。但是,我已经有了一个现有的数据库,并且有很多重复数据库。我知道,由于unique_together
在数据库级别工作,我需要使用unique-ify行,然后尝试迁移。
是否有一种很好的方法可以删除重复项(副本具有相同的(A,B,C)),以便我可以运行迁移以获取unique_together
contstraint?
答案 0 :(得分:24)
如果您乐意随意选择其中一个副本,我认为以下可能会有所帮助。也许不是最有效但足够简单,我想你只需要运行一次。如果我做了一些愚蠢的事情,请确认这一切都可以自己处理一些测试数据,因为你要删除一堆数据。
首先,我们找到形成重复的对象组。对于每个组,(任意)选择我们将要保留的“主人”。我们选择的方法是选择最低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()