Отношения моделей 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")