在不加入外键表的情况下,通过外键列来订购Django模型?

时间:2014-11-04 07:20:20

标签: django django-models

如何在不加入外键表的情况下订购与外键列相关的模型?

例如,如果我有:

class WidgetType(Model):
    id = AutoField(primary_key=True)
    label = CharField(max_length=16)
    class Meta:
        ordering = ["label"]

class Widget(Model):
    type = ForeignKey(WidgetType)

如何生成查询:

SELECT * FROM widgets_widget ORDER BY type_id

没有加入外键表?

似乎无法使用<fk>_id

>>> Widget.objects.all().order_by("type_id")
FieldError: Cannot resolve keyword 'type_id' into field. Choices are: type

使用<fk>__id似乎加入,然后忽略FK表:

>>> print Widget.objects.all().order_by("type").query
SELECT * FROM widgets_widget
LEFT OUTER JOIN widgets_widgettype ON …
ORDER BY widgets_widget.type_id

使用<fk>使用外键模型的默认排序:

>>> print Widget.objects.all().order_by("type").query
SELECT * FROM widgets_widget
LEFT OUTER JOIN widgets_widgettype ON …
ORDER BY widgets_widgettype.label

1 个答案:

答案 0 :(得分:2)

如果你正在使用Django 1.7,请参考Geo Jacob的回答 - 它包括在内。 如果没有,并且如果您不需要对象实例,则可以使用values()

来帮助自己
class UserProfile(models.Model):
    user = models.OneToOneField(User)
    country = models.CharField(max_length=255)


>>> qs = UserProfile.objects.all().values('user', 'country').order_by('user')
>>> print qs.query
SELECT `userprofiles_userprofile`.`user_id`, `userprofiles_userprofile`.`country` FROM `userprofiles_userprofile` ORDER BY `userprofiles_userprofile`.`user_id` ASC
>>> qs
[{'country': u'AT', 'user': 1L}, {'country': u'AT', 'user': 18L}, {'country': u'RU', 'user': 19L}, [...]