我的Django应用程序中有一个基本的Item模型:
class Item(models.Model):
name = models.CharField(max_length=200)
brand = models.ForeignKey(User, related_name='items')
price = models.CharField(max_length=10)
upload_date = models.DateTimeField(auto_now=False, auto_now_add=True)
对于给定的项目,我试图获取数据库中的下一个和上一个项目。
我知道我可以使用Django的内置Model.get_next_by_FOO(**kwargs)
来做到这一点,它与upload_date
字段完美配合,但我需要获得给定某些OR参数的上一个和下一个项目(例如具有特定品牌或具有特定价格的商品。)
我可以使用如下查询获取上一项:
previous_item = Item.objects.filter(id__lt=item.id).filter(Q(brand__in=brands)|Q(price__lt=100))[:1]
我的问题是下一个项目。对下一个项目运行相同的查询会导致总体上符合条件的最新项目,而不是数据库中当前项目之后的项目。我知道这是因为Django查询数据库的方式,但不知道如何绕过它以获得直接在当前项目之后的项目也符合标准。
是否有一种快速,简单的方法来获取给定多个OR参数的特定项目的下一个项目?
谢谢!
答案 0 :(得分:2)
我没有测试任何这个,所以可能只是在说我的屁股,但也许这是一个起点?
编辑:哦,是的,你很清楚“OR”问题,但我仍然错过了它。再试一次。基本思想是将查询转换为列表并合并列表。但现在考虑一下 - 我认为你可以自己创建实际的查询集 - 而不是在这种情况下它可能有用吗?您可以在函数中执行OR的常见繁重操作,然后传回一个查询集,该查询集可以由视图进一步操作。
def get_next(item, brand=None, max_price=None)
"""Returns the next item to the one provided"""
# apply limits to brand/price as specified
if brand is not None:
brand_candy = Item.objects.filter(brand=brand)\
.values_list('id','update_date')
if max_price is not None
price_candy = Item.objects.filter(price__lt=max_price)\
.values_list('id','update_date')
# arrange all candidates into a joined list
# TODO: finish this to merge the lists and sort by update_date
ids = brand_candy.join(price_candy)
# find the location of the current item in the list
# TODO: handle not being there
idx = ids.index(item.id)
# TODO: handle edges of the list
next_idx = idx + 1
# pluck out the next item
return Item.objects.get(id=ids[next_idx])