Django使用过滤的外键排序

时间:2016-01-03 00:17:17

标签: python sql django

我有以下设置

class ModelA(Model):
    field = CharField()
    order = IntegerField()

    class Meta:
         ordering: ['order']

class UserOrder(Model):
    modela = ForeignKey(ModelA)
    user = ForeignKey(User)
    order = IntegerField()

    class Meta:
        unique_together = ['modela', 'user']

我想通过存储在UserOrder中的自定义订单来订购ModelA。我可以在SQL中执行以下操作:

SELECT * FROM modela a 
  LEFT JOIN userorder uo ON a.id = uo.modela_id
  WHERE uo.user_id = 1
  ORDER BY uo.order ASC, a.order ASC;

这将首先按自定义订单排序,然后按默认订单排序。

我目前正在过滤查询集,并在数据库调用之后对其进行排序,但我希望有一种方法可以使用Django ORM在一次调用中直接从数据库中订购它。

1 个答案:

答案 0 :(得分:0)

我总结一下:

ModelA.objects.filter(userorder__user__id=1).order_by('userorder__order', 'order')

Querysets in django are lazy,这意味着,正如Daniel写的那样,你可以按照你想要的方式编写你的ORM,最后,一旦评估了查询集,它将是一个单独的db调用。