【问题标题】:Duplicate values while batching a large Django QuerySet批处理大型 Django QuerySet 时重复值
【发布时间】:2013-06-03 19:48:49
【问题描述】:

我正在生成一批客户的电话号码。我有一个大的(25m+)订阅者对象表,我正在搜索以找到匹配的记录,然后通过 Django 的 ForeignKey 关系查找每个对象的数字(订阅者对象有一个到 Customer 对象的 ForeignKey,然后有一个包含数字的 CharField)。对于大型查询集,我在批次中得到重复的数字。在大约 110k 订阅者的列表中,我得到了大约 5k 重复。

我正在使用直接过滤器生成初始 QuerySet:

subscribers = Subscribers.objects.filter(foo='bar')

这就是我生成批次的方式:

batches = [
    [s.customer.number for s in subscribers[x:x + batch_size]]
    for x in xrange(0, subscriber_count, batch_size)
]

当我在 shell 中测试这个方法时,它工作得很好;只有在生产中它才会失败。它也适用于生产中较小的 QuerySet。只有大约 50k+ 的 QuerySet 似乎有问题。此外,当我尝试从 QuerySet 创建订阅者对象列表时,一切正常:

print list(subscribers)

即使在生产中也能正常工作。所以看起来像

s.customer.number

有时会以某种方式查找错误,但仅适用于大型查询集。

【问题讨论】:

    标签: python django list-comprehension django-queryset


    【解决方案1】:

    我可以在batches 中看到您只需要客户编号。然后,仅从查询集中获取相关数据

    cnumbers =    ( Subscribers
                    .objects
                    .filter(foo='bar')
                    .values_list('customer__number', flat=True)
                    .distinct()
                   )
    

    制作块:

    batches = [
               [cnumbers[x:x+batch_size] 
               for x in xrange(0, len(cnumbers), batch_size)]
              ]
    

    您的方法中重复值的原因可能是由于数据,也许您有两个订阅者引用同一个客户。

    【讨论】:

    • 这行得通。我很好奇为什么 Django 不能处理正常的查找,但只要它工作正常。另外,我不需要 .distinct() 调用。没有它,它工作得很好。
    猜你喜欢
    • 2020-10-31
    • 2017-06-22
    • 2014-10-26
    • 2011-04-14
    • 2017-08-11
    • 2011-05-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多