Python 用户对象在ManytoMany中返回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,

我在用户对象和移动对象之间有一个多对多关系。每次我运行测试以查看成功添加的用户对象,我都会得到一个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, 
        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()