gpt4 book ai didi

django - 将 Django 模型迁移到 unique_together 约束

转载 作者:行者123 更新时间:2023-12-04 02:46:34 24 4
gpt4 key购买 nike

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

class MyModel(models.Model):
a = models.ForeignKey(A)
b = models.ForeignKey(B)
c = models.ForeignKey(C)

我想在这些字段之间强制执行唯一约束,并找到了 django 的 unique_together ,这似乎是解决方案。但是,我已经有一个现有的数据库,并且有很多重复项。我知道,因为 unique_together在数据库级别工作,我需要对行进行唯一化,然后尝试迁移。

有没有什么好的方法可以删除重复项(其中重复项具有相同的 (A,B,C)),以便我可以运行迁移来获取 unique_together约束?

最佳答案

如果您乐于任意选择重复项之一,我认为以下内容可能会奏效。也许不是最有效但足够简单,我想你只需要运行一次。请验证这一切都适用于一些测试数据,以防我做了一些愚蠢的事情,因为您将要删除一堆数据。

首先,我们找到形成重复的对象组。对于每个组,(任意)选择一个我们要保留的“主人”。我们选择的方法是选择最低的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)

然后我们遍历每个 master,并删除它的所有重复项
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()

关于django - 将 Django 模型迁移到 unique_together 约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8253550/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com