我正在尝试制作一种方法,该方法采用任意数量的sqlalchemy模型并确定它们是否具有相同的属性。该方法还采用cols_to_ignore
,它是表示要忽略的列名称的字符串数组。
为此,我使用模型的属性制作了一个映射并遍历每个模型,将每个列值添加到我存储为该映射中值的集合中。然后将地图返回到另一种方法,该方法检查任何给定地图值的长度是否为1,表示所有属性都相同,或者不止一个,即表示所提交的模型具有不同的属性值。
我遇到的问题是代码当前更新每个键上的值,而不仅仅是具有特定列名的键。
例如,使用以下模型(在此由json表示){birthMonth: 'January', birthYear: 1990}, {birthMonth: 'March', birthYear: 1990}
运行代码应得到以下映射:{'birthMonth':{January, March}, 'birthYear':{1990}}
但是结果是:{'birthMonth': {January,1990,March}, birthYear: {January,1990,March}}
这是我的代码:
def have_same_attributes(cols_to_ignore, *models):
if not all_same_model(models):
raise ValueError('Types of models must all match')
attribute_map = dict.fromkeys(models[0].__table__.columns.keys(), set())
for model in models:
for key in model.__table__.columns.keys():
if key in cols_to_ignore:
continue
attribute_map[key].add(getattr(model, key))
return attribute_map
for value in attribute_map.values():
if(len(value)>1):
return False
return True
all_same_model(models)
验证提交给该方法的所有模型都属于同一类型。我觉得这很简单,我没看到,但是我已经有一段时间没碰运气了。任何帮助表示赞赏。
最佳答案
这是常见的[[]]*10
错误的变体:dict.fromkeys
使用提供的单个对象作为每个键的值,因此只有一个set
被更新。 (它怎么知道如何重新创建“相似的” set
对象?)
关于python - 为什么每次迭代都会更新所有映射值?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57306322/