Как использовать обратные отношения в модели 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 в соответствии с вашим желанием.

Вернуться на верх