【问题标题】:Order object by field containing string value按包含字符串值的字段排序对象
【发布时间】:2020-04-21 12:11:23
【问题描述】:

我有一个 django 模型和一个表示 IP 地址的字段。我想通过 ip-address 值订购此模型的查询集,例如"10.10.10.1"

我知道Model.objects.order_by("ip_address"),但我明白了

QuerySet["10.10.10.1", "10.10.10.11", "10.10.10.12", ...]

我想要这个QuerySet["10.10.10.1", "10.10.10.2", "10.10.10.3", ...]

我不知道该怎么做。

有人有什么想法吗?

【问题讨论】:

  • Postgresql 有data types 来表示网络地址。将inet 用于您的列将产生您想要的排序(加上一些有用的functions and operators)。如果可以更改列的类型,那将是我的第一个建议。
  • 查看这篇关于 django 中自定义订单的帖子 - stackoverflow.com/questions/7619554/django-custom-order-by
  • @Marth 我在 django 模型中找到了字段 GenericIPAddressField。我认为这对我会有帮助。谢谢。
  • @TomRon 这对我很有用。谢谢。

标签: python django postgresql sql-order-by


【解决方案1】:

我是怎么做到的:

class IPAddressManager(models.Manager):

    def get_queryset(self):
        return super().get_queryset().extra(
            select={'ordered_ip_addresses': "string_to_array(ip_address, '.')::int[]", },
        )

    def all_ordered_objects(self):
        return self.order_by("ordered_ip_addresses")


class IPAddress(models.Model):

    objects = IPAddressManager()
    ip_address = models.CharField()


现在当我们调用IPAddress.objects.all_ordered_objects() 时,我们将真正订购集合

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-28
    • 2017-08-11
    • 2020-05-14
    • 1970-01-01
    相关资源
    最近更新 更多