【问题标题】:Django ManyToMany Relationship can't access fieldsDjango ManyToMany 关系无法访问字段
【发布时间】:2015-07-09 07:07:11
【问题描述】:

我有一个使用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' 对象没有属性 'todolist'

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

【问题讨论】:

  • 页面会发送一个 AttributeError 说 'User' object has no attribute 'todolist' 当你说 related_name='list_users' 你告诉 django 你想让User有一个名称为list_users 的相关字段指向一组TodoLists,因此它是user.list_users,但它可能应该是related_name='todos' 或类似的。
  • 感谢@dhke 的评论。我是 django 的新手,所以我不太熟悉它。感谢有关 related_name 的提示。

标签: python django django-orm


【解决方案1】:

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

关于您的第二个问题,我不确定您实际尝试的是哪种关系,但无论哪种情况,您都需要使用related_name 定义的属性。 (即user.created_by.all()user.list_users.all()。)

【讨论】:

  • 谢谢!有效!我忘记了 .all() 部分。我刚刚准备好如何使用用户相关名称。
猜你喜欢
  • 1970-01-01
  • 2014-07-10
  • 2018-06-09
  • 1970-01-01
  • 2022-01-23
  • 1970-01-01
  • 1970-01-01
  • 2018-02-06
相关资源
最近更新 更多