Ошибка Python: (fields.E304) Обратный метод доступа для столкновений полей с обратным средством доступа для другого поля - PullRequest
1 голос
/ 10 ноября 2019

Ниже приведен мой файл models.py в проекте Django. Всякий раз, когда я пытаюсь запустить проект, я получаю следующую ошибку. Пожалуйста, помогите, так как я только начал подбирать django. Я попытался изменить имена иностранных столбцов, как это было указано в сообщении об ошибке, но безрезультатно. Многие ответы там предлагают изменения в отношении related_name, которое не существует в моем случае.

Ошибка с консоли

app_fin.TblLockerCoutCin.jewel_item: (fields.E304) Reverseсредство доступа для TblLockerCoutCin.jewel_item конфликтует с обратным средством доступа для TblLockerCoutCin.jewel_item_code. СОВЕТ: Добавьте или измените аргумент related_name в определении для 'TblLockerCoutCin.jewel_item' или 'TblLockerCoutCin.jewel_item_code'. app_fin.TblLockerCoutCin.jewel_item: (fields.E304) Обратный метод доступа для столкновений TblLockerCoutCin.jewel_item с обратным средством доступа для TblLockerCoutCin.jewel_item_name. СОВЕТ: Добавьте или измените аргумент related_name в определении для 'TblLockerCoutCin.jewel_item' или 'TblLockerCoutCin.jewel_item_name'. app_fin.TblLockerCoutCin.jewel_item_code: (fields.E304) Обратный метод доступа для «TblLockerCoutCin.jewel_item_code» конфликтует с обратным средством доступа для «TblLockerCoutCin.jewel_item». СОВЕТ: Добавьте или измените аргумент related_name в определении для 'TblLockerCoutCin.jewel_item_code' или 'TblLockerCoutCin.jewel_item'. app_fin.TblLockerCoutCin.jewel_item_code: (fields.E304) Обратный метод доступа для «TblLockerCoutCin.jewel_item_code» конфликтует с обратным средством доступа для «TblLockerCoutCin.jewel_item_name». СОВЕТ: Добавьте или измените аргумент related_name в определении для 'TblLockerCoutCin.jewel_item_code' или 'TblLockerCoutCin.jewel_item_name'. app_fin.TblLockerCoutCin.jewel_item_name: (fields.E304) Обратный метод доступа для «TblLockerCoutCin.jewel_item_name» конфликтует с обратным средством доступа для «TblLockerCoutCin.jewel_item». СОВЕТ: Добавьте или измените аргумент related_name в определении для 'TblLockerCoutCin.jewel_item_name' или 'TblLockerCoutCin.jewel_item'. app_fin.TblLockerCoutCin.jewel_item_name: (fields.E304) Обратный метод доступа для «TblLockerCoutCin.jewel_item_name» конфликтует с обратным средством доступа для «TblLockerCoutCin.jewel_item_code». СОВЕТ: Добавьте или измените аргумент related_name в определении для 'TblLockerCoutCin.jewel_item_name' или 'TblLockerCoutCin.jewel_item_code'.

models.py

from django.db import models


class TblJewelleryInventory(models.Model):
    id = models.IntegerField(primary_key=True)
    item_code = models.CharField(unique=True, max_length=5, blank=True, null=True)
    item_name = models.CharField(max_length=250, blank=True, null=True)
    base_locker_location = models.CharField(max_length=45, blank=True, null=True)
    updated_at = models.DateTimeField()
    created_at = models.DateTimeField()

    def __str__(self):
        return self.name

    class Meta:
        managed = False
        db_table = 'tbl_jewellery_inventory'


class TblJewelleryInventoryLogs(models.Model):
    id = models.IntegerField(primary_key=True)
    item_id = models.IntegerField()
    item_code = models.CharField(unique=True, max_length=5, blank=True, null=True)
    item_name = models.CharField(max_length=250, blank=True, null=True)
    base_locker_location = models.CharField(max_length=45, blank=True, null=True)
    updated_at = models.DateTimeField()
    created_at = models.DateTimeField()
    triggered_at = models.DateTimeField()

    def __str__(self):
        return self.name

    class Meta:
        managed = False
        db_table = 'tbl_jewellery_inventory_logs'


class TblLockerCoutCin(models.Model):
    jewel_item = models.ForeignKey(TblJewelleryInventory, models.DO_NOTHING)
    jewel_item_code = models.ForeignKey(TblJewelleryInventory, models.DO_NOTHING, db_column='jewel_item_code')
    jewel_item_name = models.ForeignKey(TblJewelleryInventory, models.DO_NOTHING, db_column='jewel_item_name')
    reason = models.CharField(max_length=500, blank=True, null=True)
    is_check_out = models.IntegerField(blank=True, null=True)
    is_check_in = models.IntegerField(blank=True, null=True)
    created_at = models.DateTimeField(blank=True, null=True)

    def __str__(self):
        return self.name
    class Meta:
        managed = False
        db_table = 'tbl_locker_cout_cin'

1 Ответ

2 голосов
/ 10 ноября 2019

В вашей модели TblLockerCoutCin поля jewel_item_code и jewel_item_name имеют отношение "многие к одному" с моделью TblJewelleryInventory (в частности, с полем pk). Таким образом, когда экземпляр TblJewelleryInventory попытается пройти обратное отношение для любого из полей, он попытается использовать tbllockercoutcin_set в обоих случаях - что приведет к неоднозначности, так как оба обратных отношения связаны одним и тем жеname.

В этом случае вы хотите использовать аргумент related_name и задать разные имена доступа для полей, например:

jewel_item_code = models.ForeignKey(
    TblJewelleryInventory,
    on_delete=models.DO_NOTHING,
    related_name='jewel_item_code',  # Here
    db_column='jewel_item_code',
)
jewel_item_name = models.ForeignKey(
    TblJewelleryInventory,
    on_delete=models.DO_NOTHING,
    related_name='jewel_item_name',  # Here
    db_column='jewel_item_name',
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...