Как да замените модел на машината за приложения modelclass.properties() с функции на Django?

Разглеждам предизвикателствата при преобразуването на кодова база от използване на корекция на машината за приложения в използвайки 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.

Има ли еквивалентна функционалност в този клас?


person dfrankow    schedule 18.09.2011    source източник


Отговори (1)


Заспах и се събудих с приблизителен отговор. Човек може да използва 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
person dfrankow    schedule 18.09.2011