Использование __init__ в django для аннотирования модели дополнительной информацией - PullRequest
0 голосов
/ 02 сентября 2011

Я написал метод __init__ для одной из моих моделей, который добавляет некоторую вспомогательную информацию к объекту путем динамического добавления атрибута к объекту, который не отражает столбец в базе данных:

class MyModel(models.Model):
    title = Models.CharField()
    description = Models.TextField()

    def __init__(self, *args, **kwargs):
        self.aux_info = "I'm not in the database!"

Это казалосьчтобы работать нормально, но я нашел случай, когда он не работает.У меня есть некоторый код в представлении, где я устанавливаю переменную состояния и упаковываю список MyModels в json следующим образом:

from django.core import serializers 
from django.utils import simplejson 

...

# have to use serializers for django models
serialized_items = serializers.serialize("json", itemlist)
data["items"] = serialized_items # serialized_items is now a string
data["status"] = status

# package up data dict using simplejson for python objects
resp = simplejson.dumps(data)
return HttpResponse(resp, mimetype="application/javascript")

Проблема, похоже, в том, что сериализаторы django только сериализуют поля модели ине все атрибуты объекта, поэтому aux_info не проходит.Я также уверен, что использование сериализаторов и simplejson не является правильным способом сделать это.Спасибо за любую помощь!

1 Ответ

1 голос
/ 04 сентября 2011

Попробуйте использовать необязательный аргумент поля serialiser.

serialized_items = serializers.serialize("json", itemlist, fields=['.....', 'aux_info'])

Могу ли я также предположить, что использование метода __init__ для добавления полей считается плохой формой в django и будет гораздо лучше достигаться, например, так:

class MyModel(models.Model):
    title = Models.CharField()
    description = Models.TextField()

    def aux_info(self):
        return "I'm not in the database!"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...