Объект "Сообщение" не имеет атрибута "свойства"

Я использую Django 1.11 и Python 2.7 с библиотекой NDB от Google Appengine. Я хочу сериализовать свою модель NDB. Я слежу за этим.

models.py

class DictModel(ndb.Model):
def to_dict(self):
   return dict([(p, unicode(getattr(self, p))) for p in self.properties()])

class Post(DictModel):
    text = ndb.StringProperty()
    date = ndb.DateProperty(auto_now_add=True)
    url = ndb.StringProperty()
    url_title = ndb.StringProperty()
    url_text = ndb.StringProperty()
    privacy = ndb.StringProperty()
    tags = ndb.StringProperty()

    @classmethod
    def query_post(cls, ancestor_key):
        return cls.query(ancestor=ancestor_key).order(-cls.date)

views.py

@login_required()  
def get_user_profile(request, username):
    user = User.objects.get(username=username)
    ancestor_key = ndb.Key(Post, username)
    posts = Post.query_post(ancestor_key)
    print(posts)
    return HttpResponse(json.dumps([p.to_dict() for p in posts]), content_type='application/json')

person Salman Haseeb Sheikh    schedule 25.10.2018    source источник
comment
Ответ, который вы используете, касается не ndb, а еще более старой библиотеки db. ndb имеет встроенный to_dict метод, который вы можете использовать.   -  person Daniel Roseman    schedule 25.10.2018
comment
Используя встроенный, я получаю сообщение об ошибке datetime.date (2006, 11, 1) не сериализуемый JSON. Как это решить?   -  person Salman Haseeb Sheikh    schedule 25.10.2018


Ответы (1)


Попробуйте что-нибудь в этом роде:

def to_dict(self):
   return dict([(p, p.strftime('%y/%m/%d %H:%M:%s') if isinstance(p, datetime.datetime) else \
                    unicode(getattr(self, p))) for p in self._properties.itervalues()])

Примечание: вам может понадобиться просто datetime вместо datetime.datetime, в зависимости от того, как вы его импортируете.

Вы можете аналогичным образом расширить его для других несериализуемых типов свойств, с которыми вы можете столкнуться, если таковые имеются.

person Dan Cornilescu    schedule 27.10.2018