我有点奇怪的问题,我不能解释。Django使用分页删除查询集,没有捕获到集合的所有部分
我有一个django项目,周围有一些陈旧的旧物体。例如,可以说我的对象看起来像这样:
class blog_post(models.Model):
user_account = models.ForeignKey('accounts.Account')
text = models.CharField(max_length=255)
authors = models.ManyToManyField(author)
created = models.DateTimeField(blank=True, null=True)
这不是我的模型的确切副本,但足够接近。
我创建了一个管理命令来构建这些有序的对象的查询集,然后用分页程序删除与
我的命令看起来是这样的:
all_accounts = Account.objects.all()
for act in all_accounts.iterator():
stale_objects = blog_post.objects.filter(user_account=act,
created=django.utils.timezone.now() - datetime.timedelta(days=7))
paginator = Paginator(stale_objects.order_by('id'), 100)
for page in range(1, paginator.num_pages + 1):
page_stale_objects = blog_post.objects.filter(id__in=paginator.page(page).object_list.values_list('id'))
page_stale_objects.delete()
的问题我有在我用命令删除这些对象之后,仍然存在适合查询集参数但不会被删除的对象。所以,我必须运行该命令3次以正确查找并删除所有对象。
我首先想到我的日期范围只是奇怪的在DateTime的边缘,所以没有捕获在我的命令时间后不到1周的对象。事实并非如此,我已经从查询集中删除了created = ...过滤器,并得到了相同的结果。
为什么我的查询集在第一次运行此命令时没有捕获所有对象?没有过多的物体,最多约30,000行。
Paginator分页您的数据。我假设如果你删除'page_stale_objects',那么只会删除1个页面(这意味着你发现的对象数量超过了paginator的'per_page'值) –