Как заменить движок приложения modelclass.properties () функциями Django? - PullRequest
1 голос
/ 18 сентября 2011

Я смотрю на проблемы, возникающие при преобразовании кодовой базы от использования патча движка приложения к использованию 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.Модель.

Если я хочу использовать django-nonrel, все мои объекты модели будут вместо django.db.models.Model.

Есть ли эквивалентная функциональность в этом классе?

1 Ответ

0 голосов
/ 19 сентября 2011

Я пошел спать и проснулся с приблизительным ответом. Можно использовать 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
...