Django模型使用相关表字段的默认排序顺序

时间:2009-02-25 22:40:46

标签: django django-models

是否可以将模型的默认排序顺序设置为相关模型(而不是整数键)中的字段,即产生带有两个模型字段的SQL order by子句的东西?如果是这样,怎么样?我可以通过query_by来做到这一点,但我无法弄清楚如何默认设置它。感谢。

class Foo(models.Model):
    name = models.CharField(max_length=50)

class Bar(models.Model):
    related = models.ForeignKey(Foo)
    bar_date = models.DateField()

    class Meta:
        ordering = ('bar_date', 'related.name', )

6 个答案:

答案 0 :(得分:26)

我使用django 1.2.7而不是连接ForeignKey.Attribute我们应该使用“__”,所以这段代码将起作用:

class Meta:
    ordering = ('bar_date', 'related__name', )

答案 1 :(得分:4)

答案 2 :(得分:2)

作为order_with_respect_to(仅支持一个字段)的替代方法,您可以使用自定义管理器来提供排序。这也允许您在Foo中的多个字段上订购并且仍然具有正常的Bar.objects管理器。您必须先测试是否首先应用Meta.ordering或自定义管理器排序。

class FooSortedManager(models.Manager):
    def get_query_set(self):
        return super(FooSortedManager, self).get_query_set().order_by('foo__name')

class Foo(models.Model):
    name = models.CharField(max_length=50)

class Bar(models.Model):
    related = models.ForeignKey(Foo)
    bar_date = models.DateField()

    foo_sorted = FooSortedManager()

    class Meta:
        ordering = ('bar_date',)

答案 3 :(得分:0)

嗯......我正在解决类似的事情,同时在qs-rf之前编写旧的django应用程序,其中可能使用了“点”表示法??? ...我花了几个小时来完成“某些事情”并且我仍然不确定,但是......尝试用“__”替换点(双重下划线),这可以帮助,......事实上,我还是很好希望太多: - )))

@stuart:对于“order_with_respect_to”,我对自动添加的物理模型字段进入子表...我不完全理解事情是如何...恕我直言的文档对于语法排序非常糟糕,怎么样!

没有评论:-) http://code.djangoproject.com/ticket/8975

无论如何,我喜欢Django,但......: - ))

答案 4 :(得分:0)

在现代版的django中它是:

class Meta:
        ordering = ['word']

答案 5 :(得分:-1)

class Question(models.Model):

  question_text=models.CharField(max_length=200)
        class Meta:
    verbose_name_plural="  Question"

class Choice(models.Model):

  question=models.ForeignKey(Question,on_delete=models.CASCADE)
    class Meta:
    verbose_name_plural=" Choice"

您可以如上所述更改班级名称前的空格数,或使用以下数字订购:

class Question(models.Model):

  question_text=models.CharField(max_length=200)
        class Meta:
    verbose_name_plural="1.Question"

class Choice(models.Model):

  question=models.ForeignKey(Question,on_delete=models.CASCADE)
    class Meta:
    verbose_name_plural="2.Choice"