Ошибка при создании миграции в Django
Django=2.2.10, python3.7
mainpage/models.py
from django.conf import settings
from django.utils import timezone
from django.db import models
from django.contrib.auth.models import User
class Task(models.Model):
author = models.ForeignKey(settings.AUTH_USER_MODEL,
on_delete=models.CASCADE)
executor = models.ManyToManyField(User, blank=True, null=True)
title = models.CharField(max_length=200)
text = models.TextField()
created_date = models.DateTimeField(auto_now_add=True)
published_date = models.DateTimeField(blank=True, null=True)
def publish(self):
self.published_date = timezone.now()
self.save()
def __str__(self):
return self.title
class Meta:
verbose_name = 'Задача'
verbose_name_plural = 'Задачи'
class Profile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
first_name = models.CharField(max_length=100, blank=True)
last_name = models.CharField(max_length=100, blank=True)
email = models.EmailField(max_length=150, blank=True)
def __str__(self):
return self.user.username
При попытке python manage.py makemigrations mainpage
SystemCheckError: System check identified some issues:
ERRORS:
mainpage.Task.author: (fields.E304) Reverse accessor for 'Task.author' clashes with reverse accessor for 'Task.executor'.
HINT: Add or change a related_name argument to the definition for 'Task.author' or 'Task.executor'.
mainpage.Task.executor: (fields.E304) Reverse accessor for 'Task.executor' clashes with reverse accessor for 'Task.author'.
HINT: Add or change a related_name argument to the definition for 'Task.executor' or 'Task.author'.
WARNINGS:
mainpage.Task.executor: (fields.W340) null has no effect on ManyToManyField.
Что в данном случае делать? Как я понимаю, нужно указать, чтобы значение в поле executor не было равно значению в поле author - верно-ли мое предположение?
Ответы (3 шт):
Я решил эту проблему немного по другому, модель Profile связана OneToOne с моделью User. Я написал код так
executor = models.ManyToManyField(Profile, blank=True)
И выводилась ошибка, что Profile не импортирован
И потом я поменял Profile на User и ошибок стало еще больше
Нужно было сделать
executor = models.ManyToManyField('Profile', blank=True)
Проблема в том , что у автора вопроса был конфликт из-за related_name.
В модели Task поля author и executor - связи с одной и той же моделью. По умолчанию related_name генерится из названия модели. Так как django не может разрулить, как найти объекты связанные по executor и по author, просит добавить related_name.
Решение - указать related_name="tasks_as_author" и related_name="tast_as_executor" для соотвествующих полей, либо related_name="+", что уберет возможность обращения из User
Пример
class Task(models.Model):
author = models.ForeignKey(
settings.AUTH_USER_MODEL,
on_delete=models.CASCADE,
related_name="tasks_as_author",
)
executor = models.ManyToManyField(
User,
blank=True,
null=True,
related_name="tasks_as_executor",
)
...