首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何引入独特的与冲突的数据?

如何引入独特的与冲突的数据?
EN

Stack Overflow用户
提问于 2015-01-08 05:02:19
回答 1查看 1K关注 0票数 5

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

代码语言:javascript
复制
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'),)

现在迁移给了我:

代码语言:javascript
复制
return Database.Cursor.execute(self, query, params)
  django.db.utils.IntegrityError: columns user_id, q_id are not unique

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

我用新的迁移系统运行Django-1.7,而不是南方。

谢谢你的帮助!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-01-08 08:01:09

您只需要创建一个数据迁移,在那里您确实可以编写一个自定义函数来使用任何您想要的逻辑。详细信息请参见文献资料

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

代码语言:javascript
复制
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运行这两个迁移。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27833278

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档