【问题标题】:Django model default sort order using related table field使用相关表字段的 Django 模型默认排序顺序
【发布时间】:2009-02-25 22:40:45
【问题描述】:

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

【问题讨论】:

    标签: django django-models


    【解决方案1】:

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

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

    【讨论】:

    • 如果您只需要按一列排序并得到错误:'ordering' must be a tuple or list (even if you want to order by only one field). 只需将(...) 替换为[...]
    • @donnadulcinea 您还可以通过在第一项后添加逗号来创建单项元组,例如('bar_date',)
    【解决方案2】:

    【讨论】:

    • 这很重要,因为现在是 2021 年,我们使用的是 Django 3.2。关于 SO 的许多答案都太老了,值得一提的是,即使现在这个答案仍然成立。
    【解决方案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',)
    

    【讨论】:

      【解决方案4】:

      在现代版本的 django 中是:

      class Meta:
              ordering = ['word']
      

      【讨论】:

      • 这个答案没有帮助,因为它没有使用问题中的实际措辞,因此不清楚它在最近的版本中有何不同。
      【解决方案5】:

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

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

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

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

      【讨论】:

        【解决方案6】:
        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"
        

        【讨论】:

          猜你喜欢
          • 2010-11-01
          • 2011-03-24
          • 2015-02-18
          • 2015-08-31
          • 1970-01-01
          • 1970-01-01
          • 2017-11-10
          • 2011-04-13
          • 1970-01-01
          相关资源
          最近更新 更多