Автоматический подсчет элементов в модели ManyToMany Django

Я ищу способ подсчета количества "зарезервированных" объектов внутри созданного мной класса "IPSubnetAllocation" (если это вообще возможно?).

Эффективно то, что я делаю, это выделение меньших IP-подсетей внутри большего блока "IPBlockAllocation", например:

Родительский префикс:

  • 192.168.0.0/24

Детский префикс:

  • 192.168.0.0/31
  • 192.168.0.2/31
  • Разрешено...
  • 192.168.254/31

Я могу назначить дочерний префикс интерфейсу (любому сетевому устройству) и установить его зарезервированный статус в True. Это означает, что он больше не доступен для резервирования (эта логика выходит за рамки). Однако я хотел бы автоматически увеличивать / уменьшать счетчик "subnets_reserved" в "IPBlockAllocation".

class IPSubnetAllocation(models.Model):
    parent_prefix = models.ForeignKey(
        'IPBlockAllocation', null=True, on_delete=models.CASCADE
    )
    subnet = models.CharField(
        blank=True, null=True, unique=True, max_length=15)
    assigned_interface = models.ForeignKey(
        DeviceInterfaces, null=True, on_delete=models.CASCADE)
    reserved = models.BooleanField(default=False)
    role = models.CharField(choices=IP_BLOCK_ROLE,
                            default='Select', max_length=10)


class IPBlockAllocation(models.Model):
    name = models.CharField(unique=True, max_length=255)
    prefix = models.GenericIPAddressField(
        blank=True, null=True, unique=True, validators=[validate_ipv4_address])
    mask = models.IntegerField(choices=SUBNET_MASK, default='Select')
    subnets = models.ManyToManyField(IPSubnetAllocation, blank=True)
    subnets_count = models.IntegerField(blank=True, null=True)
    subnets_reserved = models.IntegerField(default=0, blank=True, null=True)
    role = models.CharField(choices=IP_BLOCK_ROLE,
                            default='Select', max_length=10)
Вернуться на верх