我想找到一个对象模型的下一个实例但是有一定的条件。
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的引脚,所以有点和条件。下一个实例,但价格不为空。我可以使用循环继续寻找下一个下一个,直到它的价格不为空。但有没有直接的方式?
答案 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)
应该有效。如果您有更复杂的条件或想要一个非基于日期的订购,您将不得不编写自己的方法。