gpt4 book ai didi

django - `order_by`调用后Django Paginate中的重复元素

转载 作者:行者123 更新时间:2023-12-04 01:56:21 25 4
gpt4 key购买 nike

我正在使用 Django 1.7.7。

我想知道是否有人经历过这种情况。这是我的查询:

events = Event.objects.filter(
Q(date__gt=my_date) | Q(date__isnull=True)
).filter(type__in=[...]).order_by('date')

当我尝试对它进行分页时
p = Paginator(events, 10)
p.count # Gives 91

event_ids = []
for i in xrange(1, p.count / 10 + 2):
event_ids += [i.id for i in p.page(i)]

print len(event_ids) # Still 91
print len(set(event_ids)) # 75

我注意到如果我删除了 .order_by ,我没有得到任何重复。然后我尝试了 .order_byEvent.objects.all().order_by('date')没有重复。

最后,我试过这个:
events = Event.objects.filter(
Q(date__gt=my_date) | Q(date__isnull=True)
).order_by('date')

p = Paginator(events, 10)
events.count() # Gives 131
p.count # Gives 131

event_ids = []
for i in xrange(1, p.count / 10 + 2):
event_ids += [i.id for i in p.page(i)]

len(event_ids) # Gives 131
len(set(event_ids)) # Gives 118

......并且有重复。任何人都可以解释发生了什么?

我挖掘了 Django 源代码( https://github.com/django/django/blob/master/django/core/paginator.py#L46-L55 ),这似乎与 Django 如何切片 object_list 有关。 .

任何帮助表示赞赏。谢谢。

编辑: distinct()对重复项没有影响。数据库中没有任何重复项,我认为查询不会引入任何重复项( [e for e in events.iterator()] 不会产生任何重复项)。就在分页器切片的时候。

Edit2:这是一个更完整的例子
In [1]: from django.core.paginator import Paginator

In [2]: from datetime import datetime, timedelta

In [3]: my_date = timezone.now()

In [4]: 1 events = Event.objects.filter(
2 Q(date__gt=my_date) | Q(date__isnull=True)
3 ).order_by('date')

In [5]: events.count()
Out[5]: 134

In [6]: p = Paginator(events, 10)

In [7]: p.count
Out[7]: 134

In [8]: event_ids = []

In [9]: 1 for i in xrange(1, p.num_pages + 1):
2 event_ids += [j.id for j in p.page(i)]

In [10]: len(event_ids)
Out[10]: 134

In [11]: len(set(event_ids))
Out[11]: 115

最佳答案

哦,在黑暗中拍摄,但我想我可能知道它是什么。我无法在 sqlite 中重现它,但使用 mysql。我认为 mysql 尝试对具有相同值的列进行排序使其在切片期间返回相同的结果

分页拼接基本上做了一个sql语句
SELECT ... FROM ... WHERE (date > D OR date IS NULL) ORDER BY date ASC LIMIT X OFFSET X

但是当日期为空时,我不确定 mysql 如何对其进行排序。因此,当我尝试 LIMIT 10 和 LIMIT 10 OFFSET 10 的两个 sql 查询时,它返回具有相同行的集合,而 LIMIT 20 产生一个唯一的集合。

您可以尝试将您的 order_by 更新为 order_by('id', 'date') 首先让它按唯一字段排序,它可能会修复它。

关于django - `order_by`调用后Django Paginate中的重复元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31736700/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com