Одно и то же имя для разных моделей в разных приложениях Django

У меня есть приложение 1 и приложение 2 в проекте Django. Мне нужно, чтобы каждое приложение имело свою собственную таблицу с именами Task и File. И таблица File в каждом приложении ссылается ForeignKey на таблицу Task в своем приложении. Это выглядит следующим образом:

app1.models

class Task(BasicTask):
    task_id = models.IntegerField(primary_key=True)

class File(BasicFile):
    file_id = models.AutoField(primary_key=True)
    task = models.ForeignKey(Task, on_delete=models.CASCADE, related_name='Task_one')

app2.models

class Task(BasicTask):
    task_id = models.IntegerField(primary_key=True)

class File(BasicFile):
    file_id = models.AutoField(primary_key=True)
    task = models.ForeignKey(Task, on_delete=models.CASCADE, related_name='Task_two')

main.models

class BasicTask(models.Model):
    name = models.TextField()
    priority = models.IntegerField()
    status = models.IntegerField(default=0)
    user = models.ForeignKey(
        CustomUser, on_delete=models.CASCADE, null=True, related_name='+')
    
    def __str__(self):
        return f"{self.id}. {self.name}"


class BasicFile(models.Model):
    unique_id = models.TextField()
    status = models.IntegerField(default=0)
    user = models.ForeignKey(
        CustomUser, on_delete=models.CASCADE, null=True, related_name='+')
    content = models.TextField()
    def __str__(self):
        return f"{self.id}. {self.unique_id}"
        

Проблема в том, что при выполнении миграций я получаю следующие ошибки:

ERRORS:
app2.Task.basictask_ptr: (fields.E304) Reverse accessor for 'app2.Task.basictask_ptr' clashes with reverse accessor for 'app1.Task.basictask_ptr'.
        HINT: Add or change a related_name argument to the definition for 'app2.Task.basictask_ptr' or 'app1.Task.basictask_ptr'.
app2.Task.basictask_ptr: (fields.E305) Reverse query name for 'app2.Task.basictask_ptr' clashes with reverse query name for 'app1.Task.basictask_ptr'.
        HINT: Add or change a related_name argument to the definition for 'app2.Task.basictask_ptr' or 'app1.Task.basictask_ptr'.
app1.Task.basictask_ptr: (fields.E304) Reverse accessor for 'app1.Task.basictask_ptr' clashes with reverse accessor for 'app2.Task.basictask_ptr'.
        HINT: Add or change a related_name argument to the definition for 'app1.Task.basictask_ptr' or 'app2.Task.basictask_ptr'.
app1.Task.basictask_ptr: (fields.E305) Reverse query name for 'app1.Task.basictask_ptr' clashes with reverse query name for 'app2.Task.basictask_ptr'.
        HINT: Add or change a related_name argument to the definition for 'app1.Task.basictask_ptr' or 'app2.Task.basictask_ptr'.

Подскажите, пожалуйста, как исправить эти ошибки?

Django покажет вам ошибки и скажет:

Add or change a related_name argument to the definition for ...

Так что вам нужно перейти к models.fields:

  1. app2.Task.basictask_ptr
  2. app1.Task.basictask_ptr

и добавить/изменить related_name для полей basictask_ptr для обеих моделей на разные значения.

Подробнее о смежных областях - здесь

В результате, чтобы исправить эту ошибку, необходимо было сделать следующее:

app1.models

class Task(BasicTask):
    task_id = models.IntegerField(primary_key=True)
    basictask_ptr = models.OneToOneField(BasicTask, on_delete=models.CASCADE, related_name='app1', parent_link=True)

class File(BasicFile):
    file_id = models.AutoField(primary_key=True)
    basicfile_ptr = models.OneToOneField(BasicFile, on_delete=models.CASCADE, related_name='app1', parent_link=True)
    task = models.ForeignKey(Task, on_delete=models.CASCADE)

app2.models

class Task(BasicTask):
    task_id = models.IntegerField(primary_key=True)
    basictask_ptr = models.OneToOneField(BasicTask, on_delete=models.CASCADE, related_name='app2', parent_link=True)

class File(BasicFile):
    file_id = models.AutoField(primary_key=True)
    basicfile_ptr = models.OneToOneField(BasicFile, on_delete=models.CASCADE, related_name='app2', parent_link=True)
    task = models.ForeignKey(Task, on_delete=models.CASCADE)

main.models

class BasicTask(models.Model):
    name = models.TextField()
    priority = models.IntegerField()
    status = models.IntegerField(default=0)
    user = models.ForeignKey(
        CustomUser, on_delete=models.CASCADE, null=True, related_name='+')
    
    def __str__(self):
        return f"{self.id}. {self.name}"


class BasicFile(models.Model):
    unique_id = models.TextField()
    status = models.IntegerField(default=0)
    user = models.ForeignKey(
        CustomUser, on_delete=models.CASCADE, null=True, related_name='+')
    content = models.TextField()
    def __str__(self):
        return f"{self.id}. {self.unique_id}"
        
Вернуться на верх