如何在没有加入的情况下通过ForeignKey字段本身在django中订购?

时间:2014-03-06 16:05:45

标签: django orm

所以我有一个带有ForeignKey字段MyModel的模型fkfield。我需要做这样的事情(简化):

MyModel.objects.values_list('id', 'fkfield').order_by('fkfield')

例如,我希望groupby进一步fkfield,所以我需要按照此字段对对象进行排序。我稍后将使用的唯一内容是fkfield_id。我的意思是我不需要相关模型的任何数据。

但是django执行连接sql查询(如docs中所述)并使用相关模型的ordering。如果我明确尝试按id订购

,也会发生同样的情况
MyModel.objects.values_list('id', 'fkfield').order_by('fkfield__id')

我得到了:

SELECT `mymodel`.`id`, 
       `mymodel`.`fkfield_id` 
  FROM `mymodel` 
       LEFT OUTER JOIN `related_table` 
            ON ( `mymodel`.`fkfield_id` = `related_table`.`id` ) 
ORDER BY 
       `related_table`.`id` ASC

我真正期待的是:

SELECT `id`, 
       `fkfield_id` 
  FROM `mymodel` 
ORDER BY 
       `fkfield_id` ASC

但我无法找到办法。 .order_by('fkfield_id')提出异常,说没有这样的字段。

我设法使用extra让事情变得有效但我无法理解为什么没有黑客就不能使用这种简单明了的行为。或许我错过了什么?

更新:models.py

class Producer(models.Model):
    name = models.CharField(max_length=100)

    class Meta:
        ordering = ('name',)

class Collection(models.Model):
    name = models.CharField(max_length=100)
    producer = models.ForeignKey('Producer')

    class Meta:
        ordering = ('name',)

print Collection.objects.values_list('producer', 'id').order_by('producer').query
>>> SELECT `catalog_collection`.`producer_id`, `catalog_collection`.`id`
>>> FROM `catalog_collection`
>>> INNER JOIN `catalog_producer` ON
>>> (`catalog_collection`.`producer_id` = `catalog_producer`.`id`)
>>> ORDER BY `catalog_producer`.`name` ASC

1 个答案:

答案 0 :(得分:1)

尝试

.order_by('fkfield')

我的查询是

Post.objects.values('author', 'id').order_by('author')

as sql:

SELECT "blogs_post"."author_id", 
       "blogs_post"."id" 
FROM "blogs_post" 
ORDER BY "blogs_post"."author_id" ASC

<强>更新

有点凌乱的解决方案:

MyModel.objects.extra(select={'fkfield_id': 'fkfield_id'})\
       .values_list('id', 'fkfield_id')\
       .order_by('fkfield_id')