Для модели динамических полей Джанго - PullRequest
1 голос
/ 18 мая 2010

У меня есть модель с полем 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.

Ответы [ 2 ]

1 голос
/ 19 мая 2010

Этот вопрос помог мне найти решение: Как переопределить __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 (), отображается как атрибутэкземпляра модели.

1 голос
/ 18 мая 2010

это помогает:

class GenericDocument(models.Model):
...
@property
def sample_subfield(self):
    return self.json_field['sample_subfield']

Это должно работать нормально для известных "sample_subfields", если их не слишком много.

Если вы хотите иметь возможность вызывать genericdocument.XXX (где XXX может быть что угодно ), то вам придется перезаписать __getattribute__ в вашей модели, которую я бы не стал учитывать из-за afaik Джанго делает это сам.

...