所以我有一个带有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
答案 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')