gpt4 book ai didi

django - 如何引入独特且有冲突的数据?

转载 作者:行者123 更新时间:2023-12-02 06:34:18 25 4
gpt4 key购买 nike

我为我的网站编写了一个 qna 脚本,为了防止用户开始讨论,我希望每个用户只能回复一次。

class Q(models.Model):
text = models.TextField()
user = models.ForeignKeyField('auth.User')

class A(models.Model):
text = models.TextField()
user = models.ForeignKeyField('auth.User')
q = models.ForeignKeyField('Q')
class Meta:
unique_together = (('user','q'),)

现在迁移给了我:

return Database.Cursor.execute(self, query, params)
django.db.utils.IntegrityError: columns user_id, q_id are not unique

当然,独特的数据与现有数据相冲突。我现在需要知道的是如何告诉迁移删除冲突的答案。像保留第一个找到的那样愚蠢的解决方案已经有很大帮助了。更好的是通过自定义函数来比较冲突的 A 的方法。

我正在使用新的迁移系统运行 Django-1.7 - 不是 South。

感谢您的帮助!

最佳答案

您只需要创建一个数据迁移,您实际上可以在其中编写自定义函数来使用您想要的任何逻辑。请参阅the documentation了解详情。

举个例子,仅保留最低答案 id(这应该是最早答案的良好代理)的数据迁移可能如下所示:

from django.db import models, migrations

def make_unique(apps, schema_editor):
A = apps.get_model("yourappname", "A")

# get all unique pairs of (user, question)
all_user_qs = A.objects.values_list("user_id", "q_id").distinct()

# for each pair, delete all but the first
for user_id, q_id in all_user_qs:
late_answers = A.objects.filter(user_id=user_id, q_id=q_id).order_by('id')[1:]
A.objects.filter(id__in=list(late_answers)).delete()

class Migration(migrations.Migration):

dependencies = [
('yourappname', '0001_initial'),
]

operations = [
migrations.RunPython(make_unique),
]

(这超出了我的想象,当然具有破坏性,所以请以此为例。在执行所有这些删除操作之前,您可能需要考虑备份数据。)

回顾一下:删除您尝试运行的迁移并摆脱唯一约束。按照文档中的说明创建空数据迁移。编写一个函数来删除数据库中当前存在的非唯一数据。然后重新添加唯一约束并运行 makemigrations。最后,使用 migrate 运行这两个迁移。

关于django - 如何引入独特且有冲突的数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27833278/

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