Джанго не может делать миграции: пока не может создать поле формы для подписчиков. Поскольку связанная с ним модель «Я» еще не была загружена - PullRequest
1 голос
/ 02 июня 2019

Это модель.

class CustomUser(AbstractUser):
    followers = ArrayField(ArrayField(models.ForeignKey('self',
                                                        related_name = 'following_set',
                                                        on_delete = models.CASCADE ), size = 1))
    followings = ArrayField(ArrayField(models.ForeignKey('self',
                                                        related_name = 'follower_set',
                                                        on_delete = models.CASCADE ), size = 1))

1 Ответ

3 голосов
/ 02 июня 2019

Как указано в документации на ArrayField [Django-doc] , вы не можете использовать ForeignKey [Django- документ]

base_field

Это обязательный аргумент.

Определяет базовый тип данных и поведение для массива. Это должен быть экземпляром подкласса Field. Например, это может быть IntegerField или CharField. Большинство типов полей разрешены, за исключением тех, кто обрабатывает реляционные данные (ForeignKey, OneToOneField и ManyToManyField).

Более того, ArrayField s обычно не хорошая практика в любом случае. Многие серверные базы данных не поддерживают эти поля, и, кроме того, они легко приводят к сложным запросам, и зачастую в любом случае для них нет эффективных структур индексации: если вы хотите выяснить, каковы общие последователи два пользователя, что приведет к сложной логике. Если вам нужно выполнить запрос внутри массива, то он определенно не соответствует условиям первая нормальная форма (1NF) [wiki] баз данных. Хотя, конечно, можно спорить, если 1NF всегда улучшает общее качество базы данных, я думаю, что это дополнительный аргумент, чтобы сказать, что ArrayField s обычно следует использовать в качестве «последнего средства», или если массив является « атомный "объект.

Наконец, используя два массива, будет технической задачей поддерживать их синхронизацию: если a больше не следует b, то a следует удалить из followers из b , но b также следует удалить из followings из a. Это может показаться простым, но в конечном итоге количество вариантов использования будет расти, и в конечном итоге это приведет к некоторым ошибкам.

Вы можете построить ManyToMany модель [Django-doc] , например:

class CustomUser(AbstractUser):
    followers = models.<b>ManyToManyField</b>(
        'self',
        <b>symmetrical=False,</b>
        related_name='following'
    )

Это создаст скрытую таблицу между ними. Указывая symmetrical=False [Django-doc] это означает, что если пользователь u1 следует за пользователем u2, то u2 равен , а не как таковой u1.

Если вы хотите добавить дополнительные данные в отношении «после», например, в метку времени, когда пользователь начал следовать за другим пользователем, вы можете создать модель, подобную Follow, и указать ее как through= модель вашего followers.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...