【问题标题】:Saving json data to a Django model将 json 数据保存到 Django 模型
【发布时间】:2019-05-16 11:35:34
【问题描述】:

我正在尝试将 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),但它引发了一个错误

'Manager' 对象没有属性'save'

【问题讨论】:

标签: python json django google-books


【解决方案1】:

如果您从使用 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()

但如果您需要始终保存相同的属性,在您的情况下为 titledescriptionauthor_namegenres

Book.objects.create(title = r['items'][0-2]['volumeInfo']['title'], description = r['items'][2]['volumeInfo']['description'], ......)

【讨论】:

  • 非常感谢,我被卡住了。你为什么用'r'?我得到 NameError: name 'r' is not defined
  • 在您的问题中,您将“r”定义为“r = requests.get(url).json()”,所以我使用了“r”。
【解决方案2】:

Django 使用 ORM(对象关系映射)。 因此,models.Model 实例将通过“manage.py makemigrations”命令转换为 SQL。

这样你就可以看到你使用的数据库是否有这个字段。

在 Postgresql 中,您可以使用 JSON 字段。 其他一些数据库可能有这个字段。

对于 Postgresql,您可以访问: JSONField for PostgreSQL

对于 MYSQL:JSONField for MySQL


您的错误: 上:Books.objects.save(**book_info) 首先 ** 在 python 的字典中, 变成这样:

Books.objects.save(genere='genere', author='author name', ....)

文本字段的作用是保存文本 什么是文字?是一个无限长的字符串 如何将字典转换为字符串?调用 json.dumps(字典)

将返回的值保存在您的文本字段中。

如何从字符串再次制作字典?调用 json.loads(string) 结果就是字典。

您也会看到一些限制 比如转储 datetime 或 numpy ndarray ...

【讨论】:

    猜你喜欢
    • 2016-07-07
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    • 2020-07-11
    • 1970-01-01
    • 2019-03-29
    • 2017-10-16
    相关资源
    最近更新 更多