Django:修复了IntegrityError(重复条目),现在获取了DoesNotExist

时间:2016-01-25 11:45:08

标签: python mysql django duplicates

我一直在努力将数据保存到MySQL数据库。

这是一个Django 1.4.22遗留项目,运行几个芹菜驱动的任务来生成报告。

起初我使用了get_or_create方法,但很快就发现它没有正常运行,因为它们存在很多重复输入错误。 所以我依赖于以下内容,创建一个查询集,然后使用exists()方法检查它,然后在必要时创建它或更新它:

每次只能找到一个实例(这就是我想要进行更新或创建操作的原因)

qs_snapshot = StatsSnapshot.objects.filter(list=list_id,
                                           created_at__gte=today,
                                           created_at__lt=end_day)
if qs_snapshot.exists():
    snapshot = qs_snapshot.get()
    qs_snapshot.update(**dict_stats)
else:
    try:
        snapshot = StatsSnapshot.objects.create(**dict_stats)
    except IntegrityError:
        # Duplicate entry error, upgrade the data instead or recreating it
        # There's no atomicity guaranted so sometimes there's really an
        # instance saved after the exists() and before the create()
        snapshot = qs_snapshot.get()
        qs_snapshot.update(**dict_stats)

所以我有这个丑陋的尝试,但它仍然没有像我在异常体上所做的那样,快照= qs_snapshot.get()现在提出了一个 DoesNotExist:StatsSnapshot匹配查询不存在。这怎么可能呢?我仔细检查了一下!

我已经尝试过这里给出的几个技巧,包括mysql序列的修复,但似乎没有什么能解决它。此外,每次都会出现不同的报告(列表)

1 个答案:

答案 0 :(得分:0)

<强>更新

我再次阅读代码并注意到一个问题:在except IntegrityError:内,您无法执行qs_snapshot.get(),因为qs_snapshot没有返回任何对象。您在qs_snapshot.exists()之前检查过,如果没有,则无法对查询集执行.get(),因为没有对象,这就是您获得DoesNotExist例外的原因。

更新2 : 根据您的评论,请尝试以下方法:

...
else:
    try:
        snapshot = StatsSnapshot.objects.get(**dict_stats)
    except StatsSnapshot.DoesNotExist:
        snapshot = StatsSnapshot.objects.create(**dict_stats)
    except StatsSnapshot.MultipleObjectsReturned:
        # it returned multiple objects, decide here what you want to do
        pass