#python #django #json #object
#python #django #json #объект
Вопрос:
Я пытаюсь получить объект JSON, например:
{
"username": "clelio",
"name": "Clelio de Paula",
}
и преобразуйте его в:
class User(models.Model):
name = models.CharField(max_length=30)
username = models.CharField(max_length=20)
def jsonToClass(s):
aux = json.dumps(s, self)
self.name = aux['name']
self.id = aux['id']
Итак, я попытался использовать simplejson
и один метод, называемый jsonToClass()
:
>>> import simplejson as json
>>> u1 = User()
>>> u1.jsonToClass(face)
>>> u1.save()
Это не работает. Какой самый простой способ сделать то, что я хочу?
Ответ №1:
Вы, вероятно, захотите взглянуть на (де) фреймворк сериализации Django. Учитывая JSON, подобный:
[
{
"model": "myapp.user",
"pk": "89900",
"fields": {
"name": "Clelio de Paula"
}
}
]
вы можете сохранить его следующим образом:
from django.core import serializers
for deserialized_object in serializers.deserialize("json", data):
deserialized_object.save()
Обратите внимание, что я считаю, что для использования этого метода вам нужно использовать формат сериализации Django, поэтому вам, возможно, придется соответствующим образом настроить свой JSON.
Комментарии:
1. Ну, вы могли бы использовать
json
модуль для переноса ответа во внешний массив и объект, требуемые модулем сериализации. Но это может быть излишним.2. Спасибо @nrabinowitz, я собираюсь прочитать фреймворк десериализации, но мне нужно получить эти объекты json по http-запросу, и у него нет стандарта, потому что иногда я получаю данные с помощью graph.facebook.com и еще один api youtube.
3. Я должен также указать, что в вашем исходном коде json.dumps() должен быть json.loads(s) — вероятно, поэтому исходный код не работал.
4. @nrabinowitz Тип
deserialized_object
isDeserializedObject
. Как я могу преобразовать это в тип класса модели django. (Предположим, что объект JSON, который я хочу десериализовать, возвращается путем сериализации объекта модели)
Ответ №2:
Я только что понял, что
{
"username": "clelio",
"name": "Clelio de Paula",
}
является объектом dict() .
Итак, это проще, чем я думал.
То, что мне нужно решить, это просто
def jsonToClass(self, aux):
self.name = aux['name']
self.username = aux['username']
вот и все.
Комментарии:
1. несколько опасно, но, возможно, нормально (иногда), вероятно, следует выполнить некоторые проверки и еще много чего
self.__dict__.update(aux)
2. Чем это опасно? Это потому, что он может получать повторяющиеся ключи (и переопределять различные значения), если данные не проверяются?
3. Потому что у вас могут быть поля в вашей модели, которые являются свойствами Python и защищены сложными установщиками. В противном случае проверка типов или проверка вообще не выполняются, но если вы доверяете своим данным, это может сработать
Ответ №3:
Это просто достигается следующим образом:
data = {
"username": "stackExchange",
"name": "stack overflow"
}
for obj in serializers.deserialize("json", data):
do_something_with(obj)
Комментарии:
1.
AttributeError: 'dict' object has no attribute 'read'
это ошибка, которую я получаю с Django 2.2.11 с Python 3.7.2