(fields.E331) Поле задает отношение «многие-ко-многим» через модель, которая не была установлена
Когда я запускаю makemigrations
, я получаю ошибку
teams.Team.members: (fields.E331) Поле задает отношение многие-ко-многим через модель 'TeamMember', которая не была установлена.
from django.db import models
from django.conf import settings
from common import TimestampMixin
from users.models import User
class Team(models.Model, TimestampMixin):
name = models.CharField(max_length=100)
owner = models.ForeignKey(
User,
related_name='owned_teams',
on_delete=models.CASCADE
)
members = models.ManyToManyField(
User,
through='TeamMember',
related_name='teams'
)
def __str__(self):
return self.name
class TeamMember(models.Model, TimestampMixin):
user = models.ForeignKey(
User,
on_delete=models.CASCADE
)
team = models.ForeignKey(
Team,
on_delete=models.CASCADE
)
def __str__(self):
return f"{self.user} in {self.team}"
Я не понимаю, почему это происходит, ведь приложение „teams“ установлено, и Team и TeamMember находятся в одном файле. Есть идеи?
Я не могу воспроизвести это без TimestampMixin
. Обычно миксины указываются первыми, в противном случае они часто не будут выполнять то, что от них ожидают: переопределять определенные методы, потому что Порядок разрешения методов (MRO) [python-doc], переместит их еще ниже в списке элементов для переопределения.
Правильным способом было бы следующее:
class TimestampMixin(models.Model):
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
class Meta:
abstract = True
, а затем используйте его с помощью:
class Team(TimestampMixin, models.Model):
# …
class TeamMember(TimestampMixin, models.Model):
# …
<время работы/>
Примечание: Обычно лучше использовать
settings.AUTH_USER_MODEL
[Django-doc] для ссылки на пользовательскую модель, чем использоватьUser
model [Django-doc] напрямую. Для более подробной информации вы можете посмотреть Ссылка наUser
модель раздел документации <с SUP>[Джанго-док].