是否有(已经)一种方法来比较 2 个模型实例,一个字段一个字段,看它们是否相等?
Is there (already) a way to compare 2 model instances, field for field, to see if they are equal?
我试图在我的一个测试中断言模型中的字段没有改变。我知道哲学上这是不正确的,但由于我控制了我需要知道的所有变量,我只想检查我的数据库条目是否没有改变。
我愿意接受一个解决方案,该解决方案可以将其转换为未调用某些 API 的断言,这应该更新模型,但我知道 API 可能没有完整记录,所以我更希望有一种方法可以检查所有字段值是否相等。
无论如何,我知道该怎么做,但我使用的是 django 1.6 并且 Model._meta API 还不是 public:
def assertFieldsEqual(self, instance1, instance2)
for field_name in MyModel._meta.get_all_field_names():
val1 = getattr(instance1, field_name)
if not isinstance(val1, django.db.models.Field):
continue # this excludes managers
if val1 != getattr(instance2, field_name):
return False # or raise assertion error, or whatever
return True # or don't do nothing, or whatever
那么有没有更好的方法呢?
[编辑]
python2.7
您可以使用 django.forms.models.model_to_dict
方法并将生成的字典与简单的 dict1 == dict2
进行比较。
我试图在我的一个测试中断言模型中的字段没有改变。我知道哲学上这是不正确的,但由于我控制了我需要知道的所有变量,我只想检查我的数据库条目是否没有改变。
我愿意接受一个解决方案,该解决方案可以将其转换为未调用某些 API 的断言,这应该更新模型,但我知道 API 可能没有完整记录,所以我更希望有一种方法可以检查所有字段值是否相等。
无论如何,我知道该怎么做,但我使用的是 django 1.6 并且 Model._meta API 还不是 public:
def assertFieldsEqual(self, instance1, instance2)
for field_name in MyModel._meta.get_all_field_names():
val1 = getattr(instance1, field_name)
if not isinstance(val1, django.db.models.Field):
continue # this excludes managers
if val1 != getattr(instance2, field_name):
return False # or raise assertion error, or whatever
return True # or don't do nothing, or whatever
那么有没有更好的方法呢?
[编辑] python2.7
您可以使用 django.forms.models.model_to_dict
方法并将生成的字典与简单的 dict1 == dict2
进行比较。