Как использовать обратные отношения в модели Django
Здесь я пытаюсь создать 4 внешних ключа таблицы DeviceException в таблице DeviceControlPolicy для отдельного устройства.
Эта таблица DeviceException будет состоять из 4 типов исключений устройств и я создаю отдельные столбцы в качестве внешних ключей в DeviceControlPolicy Table для каждого устройства, просто чтобы упростить задачу. [если есть предложения, пожалуйста, дайте мне знать, как я могу это использовать] и как я могу решить эту ошибку. я могу решить эту ошибку
DeviceControlPolicy.py
from django.db import models
from .src.models.Vendor import Vendor
from .src.models.DeviceException import DeviceException
class DeviceControlPolicy(models.Model):
vendor_id = models.ForeignKey(Vendor, on_delete=models.CASCADE)
id = models.IntegerField(primary_key=True)
name = models.CharField(max_length=100)
description = models.CharField(max_length=1000)
usb_storage_device = models.CharField(max_length=10, default="allow")
usb_storage_except = models.ForeignKey(DeviceException, on_delete=models.CASCADE)
cd_dvd = models.CharField(max_length=10, default="allow")
portable = models.CharField(max_length=10, default="allow")
portable_except = models.ForeignKey(DeviceException, on_delete=models.CASCADE)
wifi = models.CharField(max_length=10, default="allow")
bluetooth = models.CharField(max_length=10, default="allow")
webcam = models.CharField(max_length=10, default="allow")
webcam_except = models.ForeignKey(DeviceException, on_delete=models.CASCADE)
serial_port = models.CharField(max_length=10, default="allow")
serial_port_except = models.ForeignKey(DeviceException, on_delete=models.CASCADE)
usb_port = models.CharField(max_length=10, default="allow")
local_printer = models.CharField(max_length=10, default="allow")
network_share = models.CharField(max_length=10, default="allow")
card_reader = models.CharField(max_length=10, default="allow")
unknown_device = models.CharField(max_length=10, default="allow")
def __str__(self):
return self.name
DeviceException.py
from django.db import models
from .src.models.Vendor import Vendor
from .src.models.DeviceClassification import DeviceClassification
class DeviceException(models.Model):
vendor_id = models.ForeignKey(Vendor, on_delete=models.CASCADE)
id = models.IntegerField(primary_key=True)
name = models.CharField(max_length=100)
description = models.CharField(max_length=1000)
classification = models.ForeignKey(DeviceClassification, on_delete=models.DO_NOTHING)
exception_type = models.CharField(max_length=50)
action = models.CharField(default="allow", max_length=10)
def __str__(self):
return self.name
Ошибка, с которой я столкнулся:
ОШИБКИ: DeviceControlPolicy.portable_except: (fields.E304) Обратный аксессор для 'DeviceControlPolicy.portable_except' конфликтует с обратным аксессором для 'DeviceControlPolicy.usb_storage_except'. СОВЕТ: Добавьте или измените аргумент related_name в определении для 'DeviceControlPolicy.portable_except' или 'DeviceControlPolicy.usb_storage_except'. DeviceControlPolicy.usb_storage_except: (fields.E304) Обратный аксессор для 'DeviceControlPolicy.usb_storage_except' конфликтует с обратным аксессором для 'DeviceControlPolicy.portable_except'. СОВЕТ: Добавьте или измените аргумент related_name в определении для 'DeviceControlPolicy.usb_storage_except' или 'DeviceControlPolicy.portable_except'.
.
Ошибка имеет полный смысл, вы должны дать некоторым related_name
все, что вы хотите, вы должны добавить или изменить его, чтобы он не конфликтовал с другими ForeignKeys.
Если вы не указываете related_name
, Django автоматически создает его, используя ModelName
в качестве префикса и _set
в качестве суффикса..
Попробуйте это:
Models.py:
class DeviceControlPolicy(models.Model): id = models.IntegerField(primary_key=True) name = models.CharField(max_length=100) description = models.CharField(max_length=1000) usb_storage_device = models.CharField(max_length=10, default="allow") usb_storage_except = models.ForeignKey( DeviceException, on_delete=models.CASCADE, related_name='usb_storate') cd_dvd = models.CharField(max_length=10, default="allow") portable = models.CharField(max_length=10, default="allow") portable_except = models.ForeignKey( DeviceException, on_delete=models.CASCADE, related_name='portable_except') wifi = models.CharField(max_length=10, default="allow") bluetooth = models.CharField(max_length=10, default="allow") webcam = models.CharField(max_length=10, default="allow") webcam_except = models.ForeignKey( DeviceException, on_delete=models.CASCADE, related_name='webcam_except') serial_port = models.CharField(max_length=10, default="allow") serial_port_except = models.ForeignKey( DeviceException, on_delete=models.CASCADE, related_name='serial_port_except') usb_port = models.CharField(max_length=10, default="allow") local_printer = models.CharField(max_length=10, default="allow") network_share = models.CharField(max_length=10, default="allow") card_reader = models.CharField(max_length=10, default="allow") unknown_device = models.CharField(max_length=10, default="allow") def __str__(self): return self.name
В приведенном выше примере я добавил related_name
к каждому столбцу, который ассоциируется с Foreignkey модели DeviceException
.
Вы можете изменить related_name
в соответствии с вашим желанием.