(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>[Джанго-док].

Вернуться на верх