Skip to main content
 首页 » 编程设计

python之Django ManyToMany 关系无法访问字段

2024年08月25日29sharpest

我有一个列表模型,它两次使用 User 作为外键。

第一个对于创建者来说是ForeignKey。第二个作为该列表的用户的 ManyToManyField

class TodoList(models.Model): 
    creator = models.ForeignKey(User, default=1,related_name='created_by') 
    list_users = models.ManyToManyField(User,related_name='list_users') 
    title = models.CharField(max_length=120) 
    slug = models.SlugField(max_length=10, blank=True, null=True) 
    status = models.SlugField(choices=STATUS_CHOICES, default='active', max_length=10) 
    timestamp = models.DateTimeField(auto_now=False, auto_now_add=True) 
    updated = models.DateTimeField(auto_now=True, auto_now_add=False) 

我想做的是:

  1. 获取列表的用户。
  2. 获取登录用户的列表。

这是我的 #1 代码:

todolist = get_object_or_404(TodoList, slug=list_slug) 
users = todolist.list_users 

第一行工作正常。但是,当我获得 list_users 时,它会返回 auth.User.None,即使该列表已通过管理员添加了 3 个用户。

这是我的 #2 代码:

user = request.user 
user_todo_lists = user.todolist.all() 

页面将发送:

AttributeError: 'User' object has no attribute 'todolist'

但是当我将 list_users 重命名为 user 时。它会工作得很好。可能是什么问题?

请您参考如下方法:

关于您的第一个问题,您可能需要 todolist.list_users.all()。 (也就是说,您需要一个 QuerySet,而不是一个 Manager。)

关于你的第二个问题,我不确定你实际上试图获得哪种关系,但在任何一种情况下你都需要使用 related_name 定义的属性。 (即 user.created_by.all() 或 user.list_users.all()。)