我正在尝试为我的django模型编写测试。然而,我在测试ManyToManyFields时遇到了一个问题,还没有解决。
class TestVolunteeringModels(TestCase):
def setUp(self) -> None:
self.test_need = sample_need(title="Need", description="Description")
self.test_opportunity = sample_opportunity(title="Opportunity", description="Description")
for i in range(10):
self.test_category = sample_category(name="Category")
self.test_need.category = self.test_category
self.test_opportunity.category = self.test_category
def tearDown(self) -> None:
self.test_need.delete()
self.test_opportunity.delete()
这给我带来了这个错误:
TypeError: Direct assignment to the forward side of a many-to-many set is prohibited. Use category.set() instead.
问题是,当我按照回溯指令中所写的那样使用.set((时,如下所示:
self.test_need.category.set(self.test_category)
self.test_opportunity.category.set(self.test_category)
它给了我另一个错误,它说";TypeError:"Category"对象不可迭代">
所以我的问题是,在这种情况下,我如何访问ManyToMany字段,以便自由测试它?
.set()
需要一个可迭代的参数作为参数,但您传递的参数self.test_category
是不可迭代的。你有两个选择:
- 使用
.set([self.test_category,])
而不是.set(self.test_category)
。因此,您传递的是一个可迭代的列表,而不是一个不可迭代的单个对象(因此您得到的错误消息( - 或者,您可以使用
.add(self.test_category)
。函数.add()
将单个对象作为位置参数,将它们添加到任何预先存在的类别中
不过,您可能应该选择.set()
,因为这可以确保在执行后,关联类别集将恰好是您传递的类别集。