Reputation: 225
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
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
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:
app2.Task.basictask_ptr
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