GenericIPAddressField
Поле GenericIPAddressField применяется в моделях Django для хранения IP-адресов в формате IPv4 или IPv6. Это поле поддерживает валидацию вводимых значений и предоставляет гибкие настройки для работы с протоколами. В базу данных значение сохраняется в виде строки, но при извлечении автоматически преобразуется в строковый формат, удобный для использования.
Синтаксис
from django.db import models
class YourModel(models.Model):
ip_address = models.GenericIPAddressField(
verbose_name="IP-адрес",
protocol='both',
unpack_ipv4=False,
null=False,
blank=False,
default='127.0.0.1'
)
Параметры поля
Основные параметры GenericIPAddressField:
-
protocol- определяет допустимые протоколы. Принимает значения'both'(по умолчанию),'IPv4'или'IPv6' -
unpack_ipv4- если установлено вTrue, IPv4-адреса в формате IPv6 (например,'::ffff:192.0.2.1') будут преобразованы в обычный IPv4 ('192.0.2.1') -
null- разрешает или запрещает значениеNULLв базе данных -
blank- разрешает или запрещает пустое значение в формах -
default- значение по умолчанию для поля
Пример . Создание модели
Рассмотрим модель для хранения информации о серверах с IP-адресами:
from django.db import models
class Server(models.Model):
name = models.CharField(max_length=100)
ipv4_address = models.GenericIPAddressField(
protocol='IPv4',
verbose_name='IPv4 адрес'
)
ipv6_address = models.GenericIPAddressField(
protocol='IPv6',
null=True,
blank=True,
verbose_name='IPv6 адрес'
)
any_ip = models.GenericIPAddressField(
protocol='both',
default='0.0.0.0',
verbose_name='Любой IP'
)
def __str__(self):
return self.name
Создание и сохранение объектов
Создадим несколько серверов с разными IP-адресами:
from myapp.models import Server
# Создание сервера с IPv4 адресом
server1 = Server.objects.create(
name='web-server-1',
ipv4_address='192.168.1.10',
any_ip='192.168.1.10'
)
# Создание сервера с IPv6 адресом
server2 = Server.objects.create(
name='web-server-2',
ipv4_address='10.0.0.5',
ipv6_address='2001:0db8:85a3:0000:0000:8a2e:0370:7334',
any_ip='2001:0db8:85a3:0000:0000:8a2e:0370:7334'
)
# Создание сервера только с IPv6
server3 = Server.objects.create(
name='web-server-3',
ipv4_address='172.16.0.1',
ipv6_address='::1',
any_ip='::1'
)
Пример . Фильтрация по IP-адресам
Отфильтруем серверы, у которых IP-адрес начинается с определенной подсети:
from myapp.models import Server
# Поиск серверов с IP в подсети 192.168.1.0/24
servers = Server.objects.filter(
ipv4_address__startswith='192.168.1.'
)
for server in servers:
print(f"{server.name}: {server.ipv4_address}")
Результат выполнения кода:
"web-server-1: 192.168.1.10"
Пример . Работа с протоколами
Продемонстрируем использование параметра unpack_ipv4 для преобразования IPv4-адресов из формата IPv6:
from django.db import models
class NetworkDevice(models.Model):
name = models.CharField(max_length=100)
ip_address = models.GenericIPAddressField(
protocol='both',
unpack_ipv4=True
)
# Создание устройства с IPv6-представлением IPv4
device = NetworkDevice.objects.create(
name='router-1',
ip_address='::ffff:192.0.2.1'
)
# При извлечении адрес будет преобразован в IPv4
print(device.ip_address)
Результат выполнения кода:
"192.0.2.1"
Пример . Валидация IP-адресов
Поле GenericIPAddressField автоматически проверяет корректность вводимых адресов. Попробуем сохранить неверный адрес:
from myapp.models import Server
from django.core.exceptions import ValidationError
try:
# Попытка создать сервер с неверным IPv4 адресом
invalid_server = Server.objects.create(
name='invalid-server',
ipv4_address='256.256.256.256'
)
except ValidationError as e:
print("Ошибка валидации:")
print(e)
Результат выполнения кода:
"Ошибка валидации:"
"{'ipv4_address': ['Enter a valid IPv4 address.']}"
Смотрите также
-
поле
CharField,
которое используется для хранения строковых значений -
поле
URLField,
которое предназначено для хранения URL-адресов -
поле
EmailField,
которое используется для хранения email-адресов -
поле
SlugField,
которое применяется для хранения коротких меток