【问题标题】:Is there (already) a way to compare 2 model instances, field for field, to see if they are equal?是否(已经)有一种方法可以比较 2 个模型实例,一个字段一个字段,看看它们是否相等?
【发布时间】:2015-01-19 13:26:47
【问题描述】:

我试图在我的一个测试中断言模型中的字段没有改变。我知道在哲学上这是不正确的,但由于我控制了我需要知道的所有变量,我只想检查我的数据库条目没有改变。

我愿意接受一种解决方案,该解决方案可以将其转换为未调用某些 API 的断言,这应该更新模型,但我知道 API 可能没有完整记录,所以我更喜欢有一种方法可以检查所有字段值是否相等。

无论如何,我知道该怎么做,但我使用的是 django 1.6 并且 Model._meta API 尚未公开:

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

那么有没有更好的办法呢?

[编辑] 蟒蛇2.7

【问题讨论】:

  • 您使用的是哪个 python 版本? (2.x 或 3.x)
  • 已更新。我正在使用 djpython 2.7

标签: python django testing assert


【解决方案1】:

您可以使用django.forms.models.model_to_dict 方法并将生成的字典与简单的dict1 == dict2 进行比较。

【讨论】:

  • 虽然您的解决方案非常棒并且回答了我的问题,但如果我想知道哪些字段不同,您的解决方案需要额外的代码,而在我提供的代码中,这只是另一个打印声明或某事快。无论如何,谢谢!
  • 是的,但这基本上是因为这个解决方案一开始就不那么冗长。一个简单的[name for name in dict1.keys() if dict1[name] != dict2[name]] 会给你所有不同的键,因为dict1.keys() == dict2.keys() 因为它们是字段名。
猜你喜欢
  • 2018-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-31
  • 2021-01-07
  • 2016-03-05
  • 2013-09-08
相关资源
最近更新 更多