DjangoORm:在外键文件上应用order

时间:2016-09-14 05:23:39

标签: django django-orm

    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')

更新:此处我想按时间字段应用多个订单。 期望的输出:      什么数据与最早的日期一起出现&那么最新的一个。天生就是球员或者地面并不重要。

我失踪的地方。有人指出问题吗?

2 个答案:

答案 0 :(得分:0)

看看django docs for order_by,你可以看到你正在做的是语法正确。

修改

我唯一想到的是,使用具体的继承,导致TimePlace的两个单独的表,以及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')