我正在尝试将json数据保存到模型中。我正在获取所需的所有数据,如何将它们保存到模型中?
views.py
def book_api(request):
if request.method == 'POST':
search = request.POST['textfield']
url = 'https://www.googleapis.com/books/v1/volumes?q=' + search
print(url)
r = requests.get(url).json()
book_info = {
'title': r['items'][0-2]['volumeInfo']['title'],
'description': r['items'][2]['volumeInfo']['description'],
'author_name': r['items'][0-2]['volumeInfo']['authors'],
'genres': r['items'][0-2]['volumeInfo']['categories'],
}
print(book_info)
return redirect('index')
else:
return render(request, 'api/book_api.html')
models.py
class Genres(models.Model):
genres = models.CharField(max_length=200)
def __str__(self):
return self.genres
class Authors(models.Model):
author_name = models.CharField(max_length=200)
def __str__(self):
return self.author_name
class Books(models.Model):
title = models.CharField(max_length=300)
description = models.TextField()
authors = models.ForeignKey(Authors, on_delete=models.CASCADE)
genres = models.ForeignKey(Genres, on_delete=models.CASCADE)
def __str__(self):
return self.title
正试图做Books.objects.save(**book_info)
,但会引发错误
“经理”对象没有属性“保存”
答案 0 :(得分:0)
如果使用Google API所获得的答案在每个查询中都包含不同的属性,并且您希望将它们全部存储,则必须使用JSONField
:
from django.db import models
from django.core.serializers.json import DjangoJSONEncoder
import json
class JSONField(models.TextField):
"""
JSONField es un campo TextField que serializa/deserializa objetos JSON.
Django snippet #1478
Ejemplo:
class Page(models.Model):
data = JSONField(blank=True, null=True)
page = Page.objects.get(pk=5)
page.data = {'title': 'test', 'type': 3}
page.save()
"""
def to_python(self, value):
if value == "":
return None
try:
if isinstance(value, str):
return json.loads(value)
except ValueError:
pass
return value
def from_db_value(self, value, *args):
return self.to_python(value)
def get_db_prep_save(self, value, *args, **kwargs):
if value == "":
return None
if isinstance(value, dict):
value = json.dumps(value, cls=DjangoJSONEncoder)
return value
在您的models.py
中:
class Book(Model.models):
info = JSONField(null=True, blank=True)
...
在您的views.py
中:
...
book.info = json.loads(r.content)
book.save()
但是,如果需要始终保存相同的属性,则以title
,description
,author_name
和genres
为例:
Book.objects.create(title = r['items'][0-2]['volumeInfo']['title'], description = r['items'][2]['volumeInfo']['description'], ......)
答案 1 :(得分:0)
Django使用ORM(对象关系映射)。 因此,将使用'manage.py makemigrations'命令将一个model.Model实例转换为SQL。
所以您可以查看您使用的数据库是否具有此字段。
在Postgresql中,您可以使用JSON字段。 其他一些数据库可能具有此字段。
对于Postgresql,您可以访问: JSONField for PostgreSQL
,对于MYSQL:JSONField for MySQL