我在为我的成像网站选择下一条和上一条记录时遇到问题。 Scenrio非常简单。但它让我有点困惑
我有图像列表,按照添加日期排序。 (最近一次)。
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
而不是Pic,并且未在下一个或上一个中选择相同的日期和时间。 `
(多文件上传同时保存数据库中的图像)
请检查代码,看看我需要改进的地方。
感谢。
答案 0 :(得分:2)
由于您已经意识到仅使用创建的日期不会给您确定性排序,您还应该按照图片的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]