首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Django:在给定多个OR参数的情况下,获取特定项目的下一个和前一个项目ID

Django:在给定多个OR参数的情况下,获取特定项目的下一个和前一个项目ID
EN

Stack Overflow用户
提问于 2011-09-09 09:09:24
回答 1查看 1.6K关注 0票数 1

我的Django应用程序中有一个基本的项目模型:

代码语言:javascript
运行
复制
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参数的情况下获取前一个和下一个项目(例如,具有特定品牌OR的项目低于某个价格)。

我可以使用如下查询获取上一项:

代码语言:javascript
运行
复制
previous_item = Item.objects.filter(id__lt=item.id).filter(Q(brand__in=brands)|Q(price__lt=100))[:1]

我的问题是下一项。对下一项运行相同的查询会得到满足条件的最新项,而不是数据库中当前项之后的项。我知道这是因为Django查询数据库的方式,但不知道如何绕过它来获取紧跟在当前项之后的项,该项也符合条件。

在给定多个OR参数的情况下,有没有一种快速、简单的方法来获取特定项的下一项?

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-09-09 14:28:03

我没有测试任何东西,所以可能只是说说而已,但也许这只是一个起点?

编辑:哦,是的,你很清楚"OR“的问题,但我还是错过了。再试一次。基本思想是将查询转换为列表并合并列表。但是现在想一想--我认为你可以自己创建实际的查询集--在这种情况下它可能是有用的?您可以在函数中执行常见的繁重的OR提升,然后传递回一个查询集,视图可以进一步操作该查询集。

代码语言:javascript
运行
复制
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])
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7356175

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档