33

是否可以将模型的默认排序顺序设置为来自相关模型(而不是整数键)的字段,即产生带有来自两个模型的字段的 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', )
4

6 回答 6

36

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

class Meta:
    ordering = ('bar_date', 'related__name', )
于 2011-09-21T08:59:05.263 回答
7

看看order-with-respect-to

于 2009-02-25T23:24:37.190 回答
3

作为 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',)
于 2009-04-17T04:01:20.723 回答
2

在现代版本的 django 中,它是:

class Meta:
        ordering = ['word']
于 2016-12-30T19:47:48.263 回答
0

嗯...我在升级旧的 django 应用程序时正在解决类似的问题,该应用程序是在 qs-rf 之前编写的,其中可能使用了“点”符号???...我花了几个小时来披露“某事”,但我仍然不确定,但是...尝试用“__”(双下划线)替换点,这会有所帮助,.. 事实上,目前,我仍然希望也:-)))

@stuart:对于“order_with_respect_to”,我阅读了一些关于自动将物理模型字段添加到子表中的内容......我不完全理解这里的情况......恕我直言,文档对排序语法非常糟糕,howgh!

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

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

于 2009-03-30T18:49:47.060 回答
-2
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"
于 2017-08-10T08:36:05.560 回答