Для динамических полей экземпляров django
У меня есть модель с полем JSON или ссылка на документ CouchDB. Теперь я могу получить доступ к динамической информации таким образом, как:
genericdocument.objects.get(pk=1) == genericdocument.json_field['sample subfield']
вместо этого я хотел бы использовать
genericdocument.sample_subfield
чтобы поддерживать совместимость со всеми приложениями, которые в настоящее время реализует проект.
UPDATE
Это очень близко к тому, чего я пытаюсь достичь: http://pypi.python.org/pypi/eav-django/1.0.0, но вместо этого используйте стандартные поля Django.
Ответы
Ответ 1
Этот вопрос помог мне найти решение: Как переопределить __getattr__ в Python, не нарушая поведения по умолчанию?
class GenericDocument(models.Model):
def __getattr__(self, name):
data = self.get_couchdb_data()
if name in data.keys():
return data[name]
else:
raise AttributeError
Словарь, возвращаемый get_couchdb_data(), отображается как атрибуты экземпляра модели.
Ответ 2
Помогает ли это:
class GenericDocument(models.Model):
...
@property
def sample_subfield(self):
return self.json_field['sample_subfield']
Это должно работать нормально для известных "sample_subfields", если их не так много.
Если вы хотите иметь возможность звонить genericdocument.XXX
(где XXX может быть чем угодно), вам придется перезаписать __getattribute__
в своей модели, который я бы не стал вставлять в рассмотрение, так как afaik Django делает это сам.