JSON для моделирования класса с использованием Django

#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 is DeserializedObject . Как я могу преобразовать это в тип класса модели 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)
  

Подробности см. в документах django

Комментарии:

1. AttributeError: 'dict' object has no attribute 'read' это ошибка, которую я получаю с Django 2.2.11 с Python 3.7.2