Как указано в документации на 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
.