GenericIPAddressField

Поле GenericIPAddressField применяется в моделях Django для хранения IP-адресов в формате IPv4 или IPv6. Это поле поддерживает валидацию вводимых значений и предоставляет гибкие настройки для работы с протоколами. В базу данных значение сохраняется в виде строки, но при извлечении автоматически преобразуется в строковый формат, удобный для использования.

Синтаксис

pythonfrom 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:

Пример . Создание модели

Рассмотрим модель для хранения информации о серверах с IP-адресами:

pythonfrom 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-адресами:

pythonfrom 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-адрес начинается с определенной подсети:

pythonfrom 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}")

Результат выполнения кода:

python"web-server-1: 192.168.1.10"

Пример . Работа с протоколами

Продемонстрируем использование параметра unpack_ipv4 для преобразования IPv4-адресов из формата IPv6:

pythonfrom 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)

Результат выполнения кода:

python"192.0.2.1"

Пример . Валидация IP-адресов

Поле GenericIPAddressField автоматически проверяет корректность вводимых адресов. Попробуем сохранить неверный адрес:

pythonfrom 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)

Результат выполнения кода:

python"Ошибка валидации:"
"{'ipv4_address': ['Enter a valid IPv4 address.']}"

Смотрите также

  • поле CharField,
    которое используется для хранения строковых значений
  • поле URLField,
    которое предназначено для хранения URL-адресов
  • поле EmailField,
    которое используется для хранения email-адресов
  • поле SlugField,
    которое применяется для хранения коротких меток