Как получить маслену от модели - PullRequest
0 голосов
/ 04 октября 2019

модель, как показано ниже для хранения IP-адреса в postgres.

from django.db import models
from netfields import InetAddressField, CidrAddressField, NetManager

class TestModel(models.Model):
    client_ip = InetAddressField(default='0.0.0.0/0', store_prefix_length=True)

Я хочу получить длину маски IP напрямую через модель. но я не могу найти атрибут, соответствующий postgresql inet masklen https://www.postgresql.org/docs/9.4/functions-net.html

Ответы [ 2 ]

0 голосов
/ 04 октября 2019

Если вы хотите получить длину маски от одного объекта, вы можете определить свою модель следующим образом:

from ipaddress import ip_interface

from django.db import models
from netfields import InetAddressField, CidrAddressField, NetManager

class TestModel(models.Model):
    client_ip = InetAddressField(default=ip_interface('0.0.0.0/0'), store_prefix_length=True)

    @property
    def masklength(self):
        return self.client_ip.network.prefixlen

Пример:

obj = TestModel(client_ip=ip_interface('192.168.1.0/24'))
obj.masklength # 24

Обратите внимание, что ipaddress встроен в Python 3.3+, поэтому если вы используете более старую версию, вам придется установить this

0 голосов
/ 04 октября 2019

Вы можете создать свой собственный Func, чтобы добавить эту функцию в свой проект:

from django.db.models import IntegerField, Func


class MaskLen(Func):
    function = 'MASKLEN'

    def __init__(self, output_field=None, **extra):
        if output_field is None:
            output_field = IntegerField()
        super(TransactionNow, self).__init__(output_field=output_field, **extra)

Затем используйте его следующим образом: qs.annotate(mask_length=MaskLen('client_ip'))

...