我有一个脚本,它使用原始SQL将数百万条记录从遗留数据库导入Django数据库,以提高效率。遗留数据库没有ID主键,因此这些主键是在插入行时从序列中创建的。
我正在测试这个导入过程是否正常工作,方法是在遗留数据库中创建行,运行导入并验证我是否得到了正确的Django对象。测试的最后一部分通常看起来有点像这样:
actual = MyModel.objects.get(code=legacy_object_code)
expected = MyModel(
id=actual.id,
code=legacy_object_code,
other_property=other_value,
…
)
我必须从实际的对象中提取ID,否则就无法测试两个对象是否相等。但问题是self.assertEqual(expected, actual)
总是成功!这是因为Django object equality被定义为具有相同的类型和ID/PK。
实际检查模型示例属性的解决方法如下:
def assert_model_instance_field_equality(self, expected, actual):
expected_dict = expected.__dict__
expected_dict.pop('_state')
actual_dict = actual.__dict__
actual_dict.pop('_state')
self.assertDictEqual(expected_dict, actual_dict)
我找不到这种Assert方法,但也许我遗漏了什么。是否有这样的方法,我遗漏了什么,或者这真的是检查字段相等性的最好方法吗?
2条答案
按热度按时间z9smfwbn1#
我建议使用
_meta.fields
属性而不是__dict__
64jmpszr2#
我同意@schillingt的回答,你应该在
__dict__
上使用_ meta.get_fields()。_meta.get_fields()提供了从Django模型的Angular 来看 * 有意义 * 的字段,而不仅仅是通过Python__dict__
属性实现的所有字段。但是,我建议定义一个“提取器”来返回您在比较中关心的结构位,而不是创建一些 * 伪 * Assert。* 伪 * Assert在可读性方面有点麻烦,我尽量避免使用它们。
下面是一个示例:
在测试中,我可能会这样使用它: