Отношения моделей Django: соедините поле с экземплярами самого себя

Я создаю трекер сетевых устройств, где я хочу, чтобы интерфейсы соединялись друг с другом только по некоторым критериям. Однако у меня не получается соединить интерфейсы вместе. Я думаю, что логика моей модели неправильна, поскольку в InterfaceConnection я соединяю интерфейс с устройством, а не с другим интерфейсом.

from django.db import models
from django.core.exceptions import ValidationError
from .constants import ROLES, FORM_FACTORS


class Device(models.Model):
    hostname = models.CharField(max_length=200, unique=True, blank=False, null=False)
    ip_address = models.GenericIPAddressField(blank=False, null=False)
    role = models.CharField(max_length=20, choices=ROLES, blank=False, null=False)

    def __str__(self) -> str:
        return f"Device #{self.id} - hostname {self.hostname}"


class Interface(models.Model):
    device = models.ForeignKey(to=Device, to_field="hostname", on_delete=models.CASCADE, related_name="interface")
    name = models.CharField(max_length=200, blank=False, null=False)
    form_factor = models.CharField(max_length=10, choices=FORM_FACTORS, blank=False, null=False)

    def __str__(self) -> str:
        return f"Interface #{self.id} - {self.name}"


class InterfaceConnection(models.Model):
    interface = models.ForeignKey(to=Interface, blank=True, null=True, 
        on_delete=models.CASCADE, related_name="interface_connection")
    device = models.ForeignKey(to=Device, blank=False, null=False, 
        on_delete=models.CASCADE, related_name="interface_connection")
    
    def clean(self) -> None:
        if self.interface and self.interface.form_factor == 'virtual':
            raise ValidationError({
                "interface":
                "virtual interface cannot be connected to any other interface"
            })
        return super().clean()

    class Meta:
        unique_together = ("interface", "device")
    
    def __str__(self) -> str:
        return f"Connection #{self.id} - interface {self.interface.name} - device {self.device.hostname}"

Как выразить этот тип отношений? Буду признателен за любое понимание.

Вы можете самостоятельно сослаться на модель, указав имя модели или используя ключевое слово 'self'.

class Interface(models.Model):
    connected_interface = models.ForeignKey('Interface', blank=True, null=True, on_delete=models.CASCADE, related_name="interface_connection")

или

class Interface(models.Model):
    connected_interface = models.ForeignKey('self', blank=True, null=True, on_delete=models.CASCADE, related_name="interface_connection")
Вернуться на верх