如何在模型中添加字段的长度以进行排序?

时间:2018-06-22 06:58:56

标签: python django

如何为Model中的排序添加字段长度?

我有一个IPv4Manage模型:

class IPv4Manage(models.Model):
    """
    ipv4
    """
    ip = models.GenericIPAddressField(help_text="ip")
    ...
    class Meta:
        ordering = ['ip']

在Meta中,我们可以使用字段设置排序条件。

但是我有一个问题,我可以为ip中的订单设置Model的长度吗?

我知道我是否可以在Prefetch的长度内使用extraip并对其进行排序。

...extra(select={'length':'Length(ip)'}).order_by('length', 'ip')

但是我们可以在Model中设置顺序参数的长度吗?


EDIT-1

我创建了一个经理:

class IPv4ManageManager(models.Manager):

    def get_queryset(self):
        return super().get_queryset().annotate(length=Length('ip')).order_by('length', 'ip')

我将其添加到默认管理器中,它对我有用。

class IPv4Manage(models.Model):
    """
    ipv4
    """
    ip = models.GenericIPAddressField(help_text="ip")
    ...

    objects = IPv4ManageManager()
    class Meta:
        ordering = ['ip']

1 个答案:

答案 0 :(得分:1)

在Django 2.0中,您可以将查询表达式与ordering一起使用:

from django.db.models.functions import Length

class IPv4Manage(models.Model):
    """
    ipv4
    """
    ip = models.GenericIPAddressField(help_text="ip")
    ...
    class Meta:
        ordering = [Length('ip').asc()]