【问题标题】:Best way to get next and previous images Django获取下一张和上一张图像的最佳方法 Django
【发布时间】:2014-04-05 22:28:05
【问题描述】:

我在为我的成像​​站点选择下一个和上一个记录时遇到问题。 场景非常简单。但这让我有点困惑

我有图像列表,按添加日期排序。 (最近较早)。

Picture.objects.all().order_by('-created_at')

当用户打开一张图片时,我必须给出下一张和上一张图片的链接。

image = Picture.objects.get(id=pic_id)
next = Picture.objects.filter(created_at__lte=image.created_at)
previous = Picture.objects.filter(created_at__gte=image.created_at)

if next:
    next = next.exclude(id=image.id).order_by('-created_at')[0]
if previous:
    previous = previous.exclude(id=image.id).order_by('created_at')[0]

return (next, previous)

这里的问题是,当两张或多张图片的created_at日期相同时,就会出现less than or equal检查失败的问题。如果我将其限制为less than,则不会在下一个或上一个中选择具有相同日期和时间的图片。 `

(多文件上传同时将图片保存在数据库中)

请检查代码,看看我需要改进的地方。

谢谢。

【问题讨论】:

  • 根据 Andrew 的回答,您还需要对 id 进行排序。只是觉得值得一提的是使用DateTimeField 而不仅仅是DateField 也会有所帮助

标签: python mysql django model


【解决方案1】:

您已经意识到仅使用 created at date 并不能给您确定性排序,您还应该按图片的 id 排序。那么上一张图片的创建日期小于当前图片,或者创建日期相同且id相同。

因为这是一个复杂的查询,您需要使用Q objects

next = Picture.objects.filter(Q(created_at__lt=image.created_at) | Q(created_at=image.created_at, id__lt=image.id))

if next:
    next = next.order_by("-created_at", "id")[0]

【讨论】:

  • 谢谢 Andrew,它似乎工作正常,如何使用 Q 添加另一个过滤器?我想过滤城市下的图片记录。其中城市 = this.city。我添加了另一个 .filter() 并且看起来工作正常。但我想我也应该问这个。
  • 除了 Q() 之外,它工作得很好,谢谢你解决我的困惑...... +1
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-07-27
  • 1970-01-01
  • 1970-01-01
  • 2013-12-19
  • 1970-01-01
  • 1970-01-01
  • 2015-11-20
相关资源
最近更新 更多