Django在queryset中订购外键项

时间:2012-05-20 18:56:08

标签: django django-queryset

我正在使用Django模型抽象基类从db生成我的网站菜单。我的模型看起来像这样:

# ABSTRACT MENU 
class Menu(models.Model):
    position = models.IntegerField("Item Position", max_length=2, unique=False)
    title_en = models.CharField("Title (English)", max_length=50)
    title_es = models.CharField("Titulo (Español)", max_length=50)
    url_en = models.URLField("url (English)")
    url_es = models.URLField("url (Español)")       

    def __unicode__(self):
        return self.title_en

    class Meta:
        abstract = True

# top (main) menu ---> inherits from MENU
class MainMenu(Menu):
    class Meta:
        verbose_name_plural = "Menu Items"  

# submenu - for drop downs ---> inherits from MENU
class SubMenu(Menu):
    main_menu = models.ForeignKey(MainMenu, null=True, blank=True)
    class Meta:
        verbose_name_plural = "Sub Menu Items"

然后对于菜单我这样做:

menu_items = MainMenu.objects.all().select_related().order_by('position')

这很好,并生成按位置排序的主菜单项。但是,子菜单项不是订购的。如何确保子菜单项也按位置排序?

1 个答案:

答案 0 :(得分:1)

你试过defining the order in your model's Meta class吗?只要你可以position作为默认顺序,在每种情况下它都没有明确地被覆盖(这可能会对大型查询产生性能影响),这样就不需要使用.order_by()了。我没有为你的具体案例尝试过这个,所以如果它不起作用,请告诉我。

编辑:还要考虑查看相关模型的order_with_respect_to