Django django-filters ipaddress mysql

фильтр для ip не работает должным образом

model.py

class Network(models.Model):
start_ip_address = models.GenericIPAddressField(protocol='both', blank=True, null=True)
end_ip_address =  models.GenericIPAddressField(protocol='both', blank=True, null=True)

filters.py

class NetworkFilter(django_filters.FilterSet):
 
    f_by_address = django_filters.CharFilter(method='filter_by_address', label="BY ADDRESS")

    def filter_by_address(self, queryset, name, value):
        return queryset.filter(start_ip_address__lt=value, end_ip_address__gt=value)


    class Meta:
        model = Network
        fields = ['id', 'start_ip_address',]

фильтр по адресу результат в

SELECT `network_network`.`id`, start_ip_address, `network_network`.`end_ip_address` FROM `network_network` WHERE (`network_network`.`end_ip_address` > 10.172.148.12 AND `network_network`.`start_ip_address` < 10.172.148.12) ORDER BY `network_network`.`id` ASC

моя таблица содержит так много записей, но даже сейчас у меня возникли проблемы.

mysql> SELECT  start_ip_address, end_ip_address  from network_network where (end_ip_address > '10.172.148.12' AND start_ip_address < '10.172.148.12');
+------------------+----------------+
| start_ip_address | end_ip_address |
+------------------+----------------+
| 10.172.14.1      | 10.172.15.254  |
| 10.172.148.1     | 10.172.149.254 |
+------------------+----------------+
2 rows in set (0.01 sec)

mysql> SELECT start_ip_address, end_ip_address  FROM network_network WHERE (INET_ATON("10.172.148.12") BETWEEN INET_ATON(start_ip_address) AND INET_ATON(end_ip_address));
+------------------+----------------+
| start_ip_address | end_ip_address |
+------------------+----------------+
| 10.172.148.1     | 10.172.149.254 |
+------------------+----------------+
1 row in set (0.01 sec)

Не уверен, что нужно сделать, чтобы этот фильтр точно работал над django ORM. Не могу использовать необработанный SQL, так как пример упрощен.

Если у вас не работает, вы можете использовать extra filter для применения sql-условия строки

Подробнее о extra

Вернуться на верх