如何在不加入外键表的情况下订购与外键列相关的模型?
例如,如果我有:
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
答案 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}, [...]