Как использовать метод фильтрации для модели пользователя в другой модели (django)
У меня есть пользовательская модель пользователя:
# accounts > models.py > ...
class MyUser(AbstractUser):
[...]
fallowing_tags = models.ManyToManyField('posts.tag', blank=True)
И я хочу отфильтровать всех пользователей, которые выбрали определенный тег:
from accounts.models import MyUser as User
# ---- or -----
from django.contrib.auth import get_user_model
User = get_user_model()
class Tag(models.Model):
name = models.SlugField(max_length=50, unique=True)
@property
def fallowers(self):
return User.objects.filter(fallowing_tags=self)
Но программа выдает ошибку:
File "~/path/to/blog/accounts/models.py", line 13, in <module>
from posts.models import Tag, Post
File "~/path/to/blog/posts/models.py", line 3, in <module>
from accounts.models import MyUser as User
ImportError: cannot import name 'MyUser' from partially initialized module 'accounts.models' (most likely due to a circular import) (~/path/to/blog/accounts/models.py)
Django автоматически добавляет отношение в обратном порядке, поэтому нет не необходимости добавлять followers
, вы можете запрашивать с помощью:
mytag.myuser_set.all()
Если вы хотите изменить имя, вы можете установить related_name=…
параметр [Django-doc], например, так:
class MyUser(AbstractUser):
# …
fallowing_tags = models.ManyToManyField(
'posts.tag',
blank=True,
related_name='users'
)
Тогда вы, таким образом, запрашиваете с:
mytag.users.all()
Это ImportError
и я думаю, что это из-за этой строки from accounts.models import MyUser as User
. Она может конфликтовать со встроенной моделью django User
, которая находится в django.contrib.auth
. Попробуйте изменить ее на другое имя.
Ну, я думаю, вы также можете просто использовать Myuser
.
Попытка:
from accounts.models import MyUser
ИЛИ
from accounts.models import MyUser as anyAnotherName
Note:
Пожалуйста, не давайте никаких имен, которые могут конфликтовать с библиотеками django.