我有一个自定义用户模型:
# 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库冲突的名字。