leach
leach

Reputation: 225

The same name for different models in different Django applications

I have application 1 and application 2 in a Django project. I need each application to have its own table named Task and File. And the File table in each app refers ForeignKey to the Task table in its own app. It looks like this:

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}"
        

The problem is that I get the following errors when I make migrations:

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'.

Can you please tell me how to correct these errors?

Upvotes: 0

Views: 366

Answers (2)

leach
leach

Reputation: 225

As a result, in order to fix this error, it was necessary to do this:

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}"
        

Upvotes: 0

fannik
fannik

Reputation: 1153

Django show you the errors and say:

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

So you need to go to the models.fields:

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

and add/change related_name for the fields basictask_ptr for both models to the different values.

More about related fields is here

Upvotes: 1

Related Questions