Python 无法在Django中测试多对多引用

Python 无法在Django中测试多对多引用,python,django,Python,Django,我想测试我创建的m2m引用。在模型中,是这样的: 类配置文件(models.Model): user=models.OneToOneField(用户,on_delete=models.CASCADE) 定义(自我): 返回self.user.username 类列表(models.Model): name=models.CharField(最大长度=4) 用户=模型.ManyToManyField(配置文件) 定义(自我): 由{self.user.\uu str\uu()}返回f'{self.

我想测试我创建的m2m引用。在模型中,是这样的:

类配置文件(models.Model):
user=models.OneToOneField(用户,on_delete=models.CASCADE)
定义(自我):
返回self.user.username
类列表(models.Model):
name=models.CharField(最大长度=4)
用户=模型.ManyToManyField(配置文件)
定义(自我):
由{self.user.\uu str\uu()}返回f'{self.name}'
@接收方(保存后,发送方=用户)
def create_user_配置文件(发送方、实例、已创建、**kwargs):
如果创建:
Profile.objects.create(用户=实例)
@接收方(保存后,发送方=用户)
def save_user_配置文件(发送方、实例,**kwargs):
instance.profile.save()
我的测试如下:

def测试创建列表(self):
self.create_user(“test_user”)#返回user.objects.create_user
extended_user=Profile.objects.get(pk=1)
l=List.objects.create(
name=“2019”
)
l、 添加(扩展用户)
self.assertEqual(l._str__(),f“2019年由{extended_user._str__()}编写”)
这会导致测试失败:

Expected :'2019 by hay.Profile.None'
Actual   :'2019 by test_user'

为什么会出现此
hay.Profile.None
?我尝试在断言之前添加
l.save()
,但没有帮助。我能做什么?

您有一个多对多关系。这意味着,顾名思义,每一面都有许多项目。你不能只说
self.user
;这是许多与
self
相关的用户的访问器。您需要查询所有这些用户,然后对其进行适当的格式化,使其成为字符串;例如,用逗号连接它们

另外请注意,永远不要直接调用双下划线方法。使用内置函数,例如
str(无论什么)
。因此:

def __str__(self):
    return f'{self.name} by {', '.join(str(user) for user in self.user.all())}'


但是为了成为一个合适的测试,您可能应该为一个列表创建几个链接的配置文件。

您有一个多对多关系。这意味着,顾名思义,每一面都有许多项目。你不能只说
self.user
;这是许多与
self
相关的用户的访问器。您需要查询所有这些用户,然后对其进行适当的格式化,使其成为字符串;例如,用逗号连接它们

另外请注意,永远不要直接调用双下划线方法。使用内置函数,例如
str(无论什么)
。因此:

def __str__(self):
    return f'{self.name} by {', '.join(str(user) for user in self.user.all())}'


但是为了成为一个正确的测试,您可能应该为一个列表创建几个链接的配置文件。

由于
用户
是一个
ManyToManyField
,这不是一个
配置文件
,而是一个
配置文件
的集合。由于
用户
是一个
ManyToManyField
,这不是一个
配置文件
,但是一个
Profile
s的集合。谢谢你,它很有效。但是,我可能在这里建立了错误的关系。我之所以使用m2m,是因为“许多用户”可以有“许多列表”(这些列表只是用户,从不共享)。还有其他关系我应该选择吗?好吧,如果一个用户可以有很多列表,一个列表可以有很多用户,那么多对多就是你想要的。如果一个列表只能有一个用户,但一个用户可以有多个列表,那么您需要一个ForeignKey。谢谢,我将尝试看看m2o是否更适合此功能;)你帮了大忙,谢谢!谢谢,它很有效。但是,我可能在这里建立了错误的关系。我之所以使用m2m,是因为“许多用户”可以有“许多列表”(这些列表只是用户,从不共享)。还有其他关系我应该选择吗?好吧,如果一个用户可以有很多列表,一个列表可以有很多用户,那么多对多就是你想要的。如果一个列表只能有一个用户,但一个用户可以有多个列表,那么您需要一个ForeignKey。谢谢,我将尝试看看m2o是否更适合此功能;)你帮了大忙,谢谢!