Упорядочить объект по полю, содержащему строковое значение - PullRequest
0 голосов
/ 21 апреля 2020

У меня есть модель django и поле, представляющее IP-адрес. Я хочу заказать набор запросов этой модели по значению ip-адреса, например "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", ...]

Я не знаю, как это сделать.

У кого-нибудь есть идеи?

1 Ответ

0 голосов
/ 21 апреля 2020

Как я это сделал:

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(), у нас будет действительно заказанный набор

...