【问题标题】:Creating a django query that will retrieve the previous and next object based on alphabetical order创建一个 django 查询,该查询将根据字母顺序检索上一个和下一个对象
【发布时间】:2012-09-30 19:17:22
【问题描述】:

我有一个看起来像这样的 django 模型:

class Definition
    name = models.CharField(max_length=254)
    text = models.TextField()

如果我执行以下查询:

animal = Definition.objects.get(name='Owl')

如果我的数据库中有以下带有这些名称的定义:

Elephant, Owl, Zebra, Human

有没有办法根据模型中name 字段的字母顺序基于animal 对象进行 django 查询,以显示上一个和下一个定义?

我知道有一些方法可以根据 datetime 字段获取上一个/下一个,但我不太确定这种情况。

【问题讨论】:

    标签: python django model alphabetical


    【解决方案1】:

    我不知道有什么方法可以在不到三个查询中做到这一点。

    target = 'Owl'
    animal = Definition.objects.get(name=target)
    previous_animal = Definition.objects.order_by('name').filter(name__lt=target)[0]
    next_animal = Definition.objects.order_by('name').filter(name__gt=target)[0]
    

    【讨论】:

    • +1 不错!不知道你可以在字符串上使用 lt 和 gt 。非常方便:)。
    【解决方案2】:

    如果有人像我一样遇到这种情况......

    这是我的解决方案...它也会循环(因此,如果在最后一项上,它将第一项显示为下一项,如果在第一项上将最后一项显示为上一项)

    
        def get_previous_by_title(self):
            curr_title = self.get_object().title
            queryset = self.my_queryset()
            try:
                prev = queryset.filter(title__lt=curr_title).order_by("-title")[0:1].get()
            except Video.DoesNotExist:
                prev = queryset.order_by("-title")[0:1].get()
            return prev
    
        def get_next_by_title(self):
            curr_title = self.get_object().title
            queryset = self.my_queryset()
            try:
                next = queryset.filter(title__gt=curr_title).order_by("title")[0:1].get()
            except Video.DoesNotExist:
                next = queryset.order_by("title")[0:1].get()
            return next
    

    我有基于用户级别的自定义查询集,因此可以将查询集设置为普通查询集,例如... Video.objects.all() 但在任何地方我重复代码不止一次我创建一个函数

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-24
      相关资源
      最近更新 更多