Python 用户对象在ManytoMany中返回None
我在用户对象和移动对象之间有一个多对多关系。每次我运行测试以查看成功添加的用户对象,我都会得到一个auth.User.None 型号:Python 用户对象在ManytoMany中返回None,python,django,Python,Django,我在用户对象和移动对象之间有一个多对多关系。每次我运行测试以查看成功添加的用户对象,我都会得到一个auth.User.None 型号: class Movement(models.Model): zipcode = models.ForeignKey('ZipCode') title = models.CharField(max_length=100) description = models.CharField(max_length=400, null=False,
class Movement(models.Model):
zipcode = models.ForeignKey('ZipCode')
title = models.CharField(max_length=100)
description = models.CharField(max_length=400, null=False,
blank=True)
users = models.ManyToManyField(User)
slug = models.SlugField(unique=True)
def save(self, *args, **kwargs):
self.slug = slugify(self.title)
super(Movement, self).save(*args, **kwargs)
def __str__(self):
return self.title
表格:
视图:
一切运行正常,但当我运行测试代码希望获得用户名时,得到的只是auth.User.None
test.py:
class NewMovementViewTest(TestCase):
def setUp(self):
self.user = User.objects.create_user(
username='Megan',
email='megan@email.com',
password='password',
)
self.client.login(username='Megan', password='password')
def test_new_movement_saves_user(self):
response = self.client.post('/new_movement/',
data={'title':'A movement',
'zipcode':20016,
'description':'Some movement'})
movements = Movement.objects.all()
self.assertEqual(movements.count(), 1)
movement= movements[0]
self.assertEqual(movement.title, 'A movement')
self.assertEqual(movement.zipcode.zipcode, 20016)
self.assertEqual(movement.description, 'Some movement')
users = Movement.objects.filter(users__username__startswith="Megan")
print(users[0].users)
测试输出:
Creating test database for alias 'default'...
auth.User.None
.
----------------------------------------------------------------------
Ran 1 test in 0.191s
OK
只是一个关于命名的注释-这将返回一个“移动”查询集-而不是任何用户信息。它将基于过滤器返回移动对象(在本例中,过滤器是跨关系过滤);但请注意,它们是移动对象,而不是用户对象
您可以使用索引来获取第一个移动对象,但是users[0]。users
将返回一个对象管理器(特别是“ManyRelatedManager”)。如果要检查与此对象关联的用户,可以像对待大多数其他对象管理器一样对待它,并执行以下操作:
user = users[0].users.first()
或
请随意参考Django指南-它有一些关于多对多关系的好例子。
只是一个关于命名的注释-这将返回一个“移动”查询集-而不是任何用户信息。它将基于过滤器返回移动对象(在本例中,过滤器是跨关系过滤);但请注意,它们是移动对象,而不是用户对象
您可以使用索引来获取第一个移动对象,但是users[0]。users
将返回一个对象管理器(特别是“ManyRelatedManager”)。如果要检查与此对象关联的用户,可以像对待大多数其他对象管理器一样对待它,并执行以下操作:
user = users[0].users.first()
或
请随意参考Django指南-它有一些关于多对多关系的好例子。
您所说的“auth.User.None”是什么意思?请显示实际输出。但是您刚刚创建了一个
移动
,您是否将任何用户关联到它?我想我在“新移动”视图中这样做了,我先保存了移动,然后将用户添加到其中。您做了哪些测试?你已经证明了什么?启动并运行管理站点。它是检查数据状态的最有用的调试工具之一。您可以直观地检查这些对象是否存在,以及它们是否在多对多字段中连接。如果管理员站点显示他们已连接,则测试已中断。如果它没有显示出你想要的东西,那么我们可以开始分解你的代码来发现问题。我发现我做错了什么,我把很多人的关系看作是异国情调。应该对相关的名称标记使用反向查找。您所说的“auth.User.None”是什么意思?请显示实际输出。但是您刚刚创建了一个移动
,您是否将任何用户关联到它?我想我在“新移动”视图中这样做了,我先保存了移动,然后将用户添加到其中。您做了哪些测试?你已经证明了什么?启动并运行管理站点。它是检查数据状态的最有用的调试工具之一。您可以直观地检查这些对象是否存在,以及它们是否在多对多字段中连接。如果管理员站点显示他们已连接,则测试已中断。如果它没有显示出你想要的东西,那么我们可以开始分解你的代码来发现问题。我发现我做错了什么,我把很多人的关系看作是异国情调。应该使用带有相关名称标记的反向查找。
users = Movement.objects.filter(users__username__startswith="Megan")
user = users[0].users.first()
all_users = users[0].users.all()