如何用Django函数替换app engine modelclass.properties()?

时间:2011-09-18 03:13:36

标签: django google-app-engine django-nonrel

我正在研究将代码库从使用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。

该类中是否有相同的功能?

1 个答案:

答案 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