1

我正在生成一批客户的电话号码。我有一个大的(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

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

4

1 回答 1

0

我可以看到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)]
          ]

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

于 2013-06-04T07:42:37.790 回答