Django:如何通过引用类的字段为外键排序查询集

时间:2017-04-02 05:56:45

标签: django django-queryset

我有两节课:

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

class Part(models.Model):

    name = models.CharField(max_length=255)
    manufacturer = models.ForeignKey(
        Manufacturer,
        verbose_name=_("Manufacturer"),
        null=True,
        blank=True,
        help_text=_("The manufacturer of the part.")
    )

现在我需要进行查询以获取链接到特定制造商的所有部件。我已经使用parts = self.part_set.all()完成了这项工作。但现在我需要对订单进行排序。所以我假设.order_by()可以做到这一点,所以最后我有

def get_parts(self):
    return list(self.part_set.all().order_by('name'))

不幸的是,这不是正确的排序。所以我的问题是:通过某种属性对引用另一个对象的对象列表进行排序的正确方法是什么?

1 个答案:

答案 0 :(得分:1)

通过每个模型上的Meta类,始终可以选择默认排序。所以:

class Part(models.Model):
    name = models.CharField(max_length=255)
    manufacturer = ...

    class Meta:
        ordering = ['name']  # or ['-name'] for descending

现在,每次获得Part个对象时,除非在查询中使用order_by,否则它们将按name排序。

要回答你的问题,你可以使用它:

self.part_set.order_by('part__name')

但是如果您已经在ordering课程中指定了Meta Part设置,那么您就不必这样写。而是写:

self.part_set.order_by('part')

并且Django将根据Part Part的{​​{1}}设置订购Meta个对象。