我有下表:
class OverallAdvise(mixins.OrdMixin, mixins.EqMixin, models.Model):
section = models.ForeignKey('quest.Section',
on_delete=models.CASCADE,
related_name='section_owner')
range_start = models.IntegerField(blank=True, null=True)
range_end = models.IntegerField(blank=True, null=True)
get_advise = models.CharField(max_length=500)
然后,在序列化器中,我试图根据计算得分选择get_advise
。
我的查询是:
get_overall_advise = OverallAdvise.objects.filter(section_id = section_id, range_start__gte = section_overall_score, range_end__lte = section_overall_score).values("get_advise")
但它不起作用。
当我在查询中仅使用section_id
时,它正在工作。
给出了section_id=6
和section_overall_score=8
。
我需要像range_start<=6<=range_end
这样的东西。
你能帮我吗?
在你的mysql
示例中,我看到range_start永远不会大于range_end,因此range_start__gte=value
和range_end__lte=value
将不匹配任何条目,因为值是相同的。除了range_start == range_end == value之外
所以如果你想要range_start <= 6 <= range_end
你应该使用range_start__lte=6, range_end__gte=6
在编写ORM查询时,就像语句一样,您将看到错误
for row in OverallAdvise.objects.all():
if row.section_id == section_id:
if range_start >= section_overall_score:
if range_end <= section_overall_score:
return row.get_advice
这将永远不会成功,因为range_start
<= range_end
。我想你想在你的查询中切换lte
和gte
。
get_overall_advise = OverallAdvise.objects.filter(section_id = section_id, range_start__lte = section_overall_score, range_end__gte = section_overall_score).values("get_advise")