Django next / prev具有一定条件的模型实例?

时间:2014-10-31 14:13:56

标签: python django django-orm

我想找到一个对象模型的下一个实例但是有一定的条件。

Models.py:

class Pin(models.Model):
    submitter = models.ForeignKey(User)
    url = models.TextField(blank=True, null=True)
    price = models.DecimalField(blank=True, null=True, max_digits=10, decimal_places=2)
    published = models.DateTimeField(auto_now_add=True)

我知道一个实例的pk来获取我可以做的下一个实例:

pin = Pin.objects.get(pk=123)
pin_next = pin.get_next_by_published()

但是我希望下一个price不等于null的引脚,所以有点和条件。下一个实例,但价格不为空。我可以使用循环继续寻找下一个下一个,直到它的价格不为空。但有没有直接的方式?

2 个答案:

答案 0 :(得分:2)

您必须自己编写查询,但这相当简单:)

请注意,由于published可能不是唯一的,因此可能无法始终如您所愿。我会建议基于pk的导航。

class Pin(models.Model):
    submitter = models.ForeignKey(User)
    url = models.TextField(blank=True, null=True)
    price = models.DecimalField(blank=True, null=True, max_digits=10, decimal_places=2)
    published = models.DateTimeField(auto_now_add=True)

    def others(self):
        return self.objects.exclude(pk=self.pk)

    def others_with_price(self):
        return self.others().filter(price__isnull=False)

    # By primary key:

    def get_next(self):
        return self.others_with_price(pk__gt=self.pk).order_by('pk')[0]

    def get_prev(self):
        return self.others_with_price(pk__lt=self.pk).order_by('-pk')[0]

    # By published:

    def get_next_published(self):
        return self.others_with_price(published__gte=self.published).order_by('published')[0]

    def get_prev_published(self):
        return self.others_with_price(published__lte=self.published).order_by('-published')[0]

答案 1 :(得分:2)

您可以将其他查找关键字参数传递给get_next_by_XXX方法,因此在上述情况下pin.get_next_by_published(price__isnull=False)应该有效。如果您有更复杂的条件或想要一个非基于日期的订购,您将不得不编写自己的方法。