Как использовать метод фильтрации для модели пользователя в другой модели (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.

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