我正在研究将代码库从使用app engine patch转换为使用django-nonrel所面临的挑战。
此代码库中多次发生的事情之一是迭代实体的所有属性。例如,比较器,复制构造函数,__str__等价物等。
简化示例:
def compare_things(thing_a, thing_b):
'''Compare two things on properties not in Thing.COMPARE_IGNORE_PROPS'''
if type(thing_a) != type(thing_b): return "Internal error"
for prop in Thing.properties():
if prop not in Thing.COMPARE_IGNORE_PROPS:
attr_a = getattr(thing_a, prop)
attr_b = getattr(thing_b, prop)
if attr_a != attr_b:
return prop + ": " + str(attr_a) + " is not equal to " + str(attr_b)
return ''
但是,properties()函数来自google.appengine.ext.db.Model。
如果我想使用django-nonrel,我的所有模型对象都将来自django.db.models.Model。
该类中是否有相同的功能?
答案 0 :(得分:0)
我睡着了,醒来后得到了一个近似的回答。可以使用dir循环遍历类成员。像(未经测试)的东西:
from django.db import models
def properties(model_class):
ret = []
for name in dir(model_class):
thing = getattr(model_class, name)
if (isinstance(thing, models.Field)):
ret.append(name)
return ret