我正在生成批量的客户电话号码。我有一个大的(25m +)订阅者对象表,我正在搜索找到匹配的记录,然后通过Django的ForeignKey关系查找每个对象的数字(Subscriber对象有一个到Customer对象的ForeignKey,然后有一个包含数字的CharField。对于大型QuerySet,我在批量中获得重复的数字。在大约110,000个订阅者的列表中,我得到大约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 +的QuerySets似乎有问题。此外,当我尝试从QuerySet创建一个Subscriber对象列表时,一切都很好:
print list(subscribers)
即使在生产中也能正常工作。
似乎就好了s.customer.number
偶尔会以某种方式执行查找错误,但仅适用于大型QuerySet。
答案 0 :(得分: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)]
]
您的方法中重复值的原因可能是由于数据,也许您有两个订阅者引用同一个客户。