django模型中的order属性如何确定字段的排序?

时间:2015-03-30 12:41:21

标签: python django django-rest-framework

一读时问题似乎很愚蠢。我知道。我遇到了一些属性' order'这只是一个IntegerField确定前端的排序。示例模型:

class FilterGroup(models.Model):
    """
    A way to group different kinds of filters from each other.
    """
    name = models.CharField(max_length=255)
    slug = models.CharField(max_length=255, blank=True, null=True,
                            help_text='the slug to be used as the name of the '
                                      'query parameter in the search URL')
    order = models.IntegerField(default=1,
                                help_text='An integer defining which order '
                                          'the filter group should show up '
                                          'in the sidebar')

    class Meta:
        ordering = ('-order', 'name')
        unique_together = (
            ('name', 'slug'),
        )

有三个过滤器组。文件,技能水平和主题。它们按顺序呈现:'主题','技能级别''文档'这不是按字母顺序排列的。根据帮助文本,顺序确定字段的顺序。我理解Meta排序表明它按名称递增并按顺序递减。由于order的值是1,它是如何渲染的。这是序列化程序代码段:

for group_options, filters in filter_groups.items():
            group_name, group_slug, group_order = group_options
            sorted_filters = sorted(filters, key=attrgetter('name'))
            grouped_filters.append(FilterGroup(name=group_name,
                                               slug=group_slug,
                                               order=group_order,
                                               options=sorted_filters))
        return FacetedFilterSerializer(
            sorted(grouped_filters, key=attrgetter('order')),
            many=True
        ).data

通过获取'命令'进行排序。属性。我不明白渲染过滤器组的顺序背后的原因是整数值为1

1 个答案:

答案 0 :(得分:0)

Meta.ordering property定义了在Django中使用查询集检索对象时的默认顺序。它大致相当于每次调用Model.objects.order_by(Model.Meta.ordering)时调用Model.objects,这意味着您也可以在任何查询集上通过calling order_by覆盖它。

在您的情况下,您实际上并没有使用查询集来构建FilterGroup个对象的列表,因此Meta.ordering实际上并没有发挥作用。您在sorted的最终通话中手动覆盖排序,实际上相当于.order_by("order"),与您在Meta.ordering中设置的相反。