class Game(models.Model):
player = models.ForeignKey(place, null=True, blank=True, verbose_name="place")
ground = models.ForeignKey(country, null=True, blank=True, verbose_name="place")
total_score = models.ForeignKey(score, null=True, blank=True, verbose_name="place")
class Place(Time):
child = models.CharField(max_length=100, blank=True, verbose_name="child", db_index=True)
class country(Time):
child = models.CharField(max_length=100, blank=True, verbose_name="country", db_index=True)
class Time (models.Model):
time = models.CharField(max_length=100, null=True, blank=True, verbose_name="time")
我想根据时间对数据进行排序
Django Orm检索数据&按降序应用订单
Game.objects.filter(...).order_by('-player__time','-ground__time')
更新:此处我想按时间字段应用多个订单。 期望的输出: 什么数据与最早的日期一起出现&那么最新的一个。天生就是球员或者地面并不重要。
我失踪的地方。有人指出问题吗?
答案 0 :(得分:0)
看看django docs for order_by,你可以看到你正在做的是语法正确。
修改强>
我唯一想到的是,使用具体的继承,导致Time
和Place
的两个单独的表,以及order_by失败的原因,它'值得尝试在Abstract = True
中为class Meta
设置Time
,因为为Time
创建一个表是没有意义的,并且它是{s}}也妨碍了你的查询能力。
class Time (models.Model):
class Meta:
abstract = True
time = models.CharField(max_length=100, null=True, blank=True, verbose_name="time")
答案 1 :(得分:0)
在Django QuerySet order_by doc中,您可以看到,如果您将多个字段名称传递给order_by,它会逐个字段对结果进行排序。
在这种情况下,您需要使用Django conditional expressions,它将是这样的:
from django.db.models import Case, CharField, F, When, Value
Game.objects.annotate(order_value=Case(
When(player__time__gt=F('ground__time'), then=F('player__time')),
default=F('ground__time'),
output_field=CharField())).order_by('-order_value')