”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 将 JSON 数据转储到 Django 模型:使用 Django 设置和命令

将 JSON 数据转储到 Django 模型:使用 Django 设置和命令

发布于2024-09-02
浏览:397

Dumping JSON data to Django Models: Using Django Setup and Commands

当您使用 Django 或使用 Django Rest Framework (DRF) 的 REST API 完成网站的第一个版本时,数据需求变得最重要。对于类似的问题,我写了上一篇文章,其中讨论了通过直接插入 SQLite 数据库和表将 JSON 数据转储到 Django 模型中的直接方法。然而,我也提到 Django 有 loaddata、dumpdata 和用于类似问题的固定装置,但需要对框架有更多的了解。

今天,我将回顾一下学习曲线,讨论如何将普通 JSON 数据转换为固定装置,然后使用 loaddata 将 JSON 数据转储到特定模型中。同样,如果您有一些模型数据(可以通过管理页面等添加),那么如何将其转储为固定装置以与其他模型一起使用或在其他项目中使用。

上一篇文章有​​两部分:第一部分是数据转储所需的正常设置,第二部分是关于将 JSON 数据转储到模型中的 python 脚本。因此,请保持文章简短,在本文中,我将从第二部分开始,您可以按照上一篇文章的第一部分来阅读本文。因此,假设您有一个图书应用程序,并且其中 models.py 中有 Book 模型,类似地,API 端点已准备就绪,例如(上一篇文章的 Github 存储库):
http://127.0.0.1:8000/api/books/1

或者您只是想将数据加载到基于 Django 的网站的 Book 模型。您可以关注以下 git 存储库中的代码。
JSON 数据转储到模型

给定两个存储库,您可以使用任何人来关注这里的文章,您只需要以下内容:

  1. 一个正在运行的 Django 项目,具有带有或不带有 API 功能的 Book 模型
  2. 一个 json 文件,其中包含符合 Book 模型的图书信息。

示例 1:book/models.py 中的书籍模型

from django.db import models

class Book(models.Model):
    title = models.CharField(max_length=200)
    author = models.CharField(max_length=100)    
    isbn = models.CharField(max_length=13, unique=True)
    pages = models.PositiveIntegerField()   
    language = models.CharField(max_length=30)

    def __str__(self):
        return self.title

books.json

[
  {
    "title": "Example Book 1",
    "author": "John Doe",
    "isbn": "1234567890123",
    "pages": 350,
    "language": "English"
  },
  {
    "title": "Example Book 2",
    "author": "Kumar Ajit",
    "isbn": "9876543210987",
    "pages": 280,
    "language": "Hindi"
  }
]

示例 2:上一篇文章中的 Book 模型

from django.db import models

class Book(models.Model):
    title = models.CharField(max_length=200)
    author = models.CharField(max_length=100)
    price = models.DecimalField(max_digits=6, decimal_places=2)

    def __str__(self):
        return self.title

您可以在此处找到 data.json 文件。

数据转储到模型

我们有一个正在运行的 Django 项目,其中包含模型 Book 和一个包含书籍信息的额外 JSON 文件。那么,现在的问题是什么?
我们希望将 JSON 数据转储到模型中,以便可以与 Django 网站一起使用(例如将数据传递到模板以显示给用户)或通过 API 向前端提供数据。

Django 在管理页面(您可以注册模型并插入数据)和 shell(使用 SQL 或 ORM 直接操作数据库)旁边有 loaddata、fixtures 和 dumpdata。然而,如果想要合并大数据或想要多次执行(通常是开发和测试期间的用例),通过固定装置加载数据似乎更好。

让我们首先解释这些工具,然后深入研究 python 脚本来实现数据转储任务。

加载数据

$django-admin loaddata 

固定装置

固定装置是包含数据库序列化内容的文件集合。每个固定装置都有一个唯一的名称,并且组成固定装置的文件可以分布在多个应用程序中的多个目录中。 [来源]

让我们跳到文章的后续部分,看看书籍装置。

[
  {
    "model": "book.book",
    "pk": 40,
    "fields": {
      "title": "Example Book 1",
      "author": "John Doe",
      "isbn": "123456734890123",
      "pages": 350,
      "language": "English"
    }
  },
  {
    "model": "book.book",
    "pk": 41,
    "fields": {
      "title": "Example Book 2",
      "author": "Kumar Ajit",
      "isbn": "9876543455210987",
      "pages": 280,
      "language": "Hindi"
    }
  }
]

如果您查看了fixture文件,您一定会发现它只是另一个带有更多键值对的JSON文件,而这些是Django模型/表的元数据。所以,是的,你是对的,我们的目标是将 books.json 格式转换为固定格式,以便 Django 管理工具能够识别它并将数据转储到合适的表中。

现在,要创建夹具,您可以有两种情况:1)模型中有数据,并且您想要创建夹具以供将来使用或测试等。
2)您在模型/表中没有数据,但在外部源(如 json、csv 或任何其他格式)中拥有数据,并且您希望通过前面讨论的命令 loaddata 在 Django 中加载该数据。(这文章是关于这种情况的,但在最后,我们将使用 dumpdata 来比较手动和 dumpdata 输出。)

在使用Python脚本将普通json文件转换为fixture格式之前,让我们先了解一下Django如何查找fixture文件以及如何使用它。

共有三个兴趣点和顺序[来源]:

  1. 在每个已安装应用程序的固定目录中:这类似于 Django 项目内组织的其他目录(例如模板或媒体或静态文件夹)的建议。但是,您也可以给出如下所述的直接路径。

  2. 在 FIXTURE_DIRS 设置中列出的任何目录中

  3. 在由固定装置命名的文字路径中:适用于较小的项目或应用程序,但最好为固定装置提供适当的推荐位置,以便可以轻松地用于测试或调试等。

注意:使用夹具的一个主要好处是在夹具上应用和使用压缩。

转储数据

这是 django-admin 命令,用于将表的所有数据输出到标准输出。

注 1:将数据库中与指定应用程序关联的所有数据输出到标准输出。
注2:dumpdata的输出可以用作loaddata的输入。(作为fixture)

django-admin dumpdata [app_label[.ModelName] 

您可以从此链接阅读更多内容。

从简单的 json 到 Django Fixtures 的 Python 脚本。

from django.apps import apps
import django
import os
import json


# Set the Django settings module
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'dataloading.settings')
django.setup()

# get all models
models = apps.get_models()

# Get the model names
for model in models:
    print(model)
    print(model.__name__)

# Choose Model to create fixtures
from book.models import Book 

# Get all field names
field_names = [field.name for field in Book._meta.get_fields()]
fixture_name = "books.json"

#read the data file json, csv etc.

with open('data.json','r') as fp:
    books= json.load(fp)


books_fixture =[]
# get the pk value from model , if there is data
pk=1 
# iterate all the books in json file
for book in books:
    book_fixture={}
    # Add model name (most important for fixture)
    book_fixture['model']= 'book.book'
    pk =1
    book_fixture['pk']=pk
    # assuming the data has same fields name as model else mapping is required
    book_fixture['fields']=book
    books_fixture.append(book_fixture)
# Writing converted Json as file for fixture

with open(fixture_name,'w') as fp:
    json.dump(books_fixture,fp)

# print(field_names)
# if __name__ =='__main__' :
    #create_book()  

一旦你的装置被创建为 books.json。是时候将其 /copy 移动到合适的位置(book/fixtures/book/),以便 Django 管理器可以轻松找到它,然后运行 ​​loaddata 命令将所有数据转储到 Book 模型。

$mv books.json book/fixtures/book/
$python manage.py loaddata book/fixtures/book/books.json

您也可以使用类似的脚本直接将数据写入模型的sing.save()方法中。下面是 create_book() 方法,可用于将一个或多个(循环)数据记录插入 Book 模型。

# def create_book():
#     book = Book(
#         title="This is from script",
#         author ="ajit",
#         isbn = "2024-0809",
#         pages=300,
#         language ='English'
#     )
#     book.save()
#     print(f'Book {book.title} by {book.author} created.')

您还可以查看 Django 扩展中的 Dumpscript 来执行类似的任务。

希望对您有帮助。

注:由于时间限制,该文章未正确校对和格式。因此,请谨慎使用,如有任何错误、疑问或疑问,请在下面留下评论。我会加班回复和编辑文章。

版本声明 本文转载于:https://dev.to/ajitkumar/dumping-json-data-to-django-models-using-django-setup-and-commands-1hj2?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • 让您的网页更快
    让您的网页更快
    什么是 DOM?它吃什么? DOM(文档对象模型)是网页及其开发的基础。它是 HTML 和 XML 文档的编程接口,以树状对象表示文档的结构。有树枝和树叶。文档中的每个元素、属性和文本片段都成为该树中的一个节点。它允许 JavaScript 与 HTML 元素交互、修改它们或添加新...
    编程 发布于2024-11-07
  • JavaScript 中的 require 与 import
    JavaScript 中的 require 与 import
    我记得当我开始编码时,我会看到一些js文件使用require()来导入模块和其他文件使用import。这总是让我感到困惑,因为我并不真正理解其中的区别是什么,或者为什么项目之间存在不一致。如果您想知道同样的事情,请继续阅读! 什么是 CommonJS? CommonJS 是一组用于在...
    编程 发布于2024-11-07
  • 使用镜像部署 Vite/React 应用程序:完整指南
    使用镜像部署 Vite/React 应用程序:完整指南
    在 GitHub Pages 上部署 Vite/React 应用程序是一个令人兴奋的里程碑,但这个过程有时会带来意想不到的挑战,特别是在处理图像和资产时。这篇博文将引导您完成整个过程,从最初的部署到解决常见问题并找到有效的解决方案。 无论您是初学者还是有经验的人,本指南都将帮助您避免常见的陷阱,并...
    编程 发布于2024-11-07
  • 我如何在我的 React 应用程序中优化 API 调用
    我如何在我的 React 应用程序中优化 API 调用
    作为 React 开发者,我们经常面临需要通过 API 同步多个快速状态变化的场景。对每一个微小的变化进行 API 调用可能效率低下,并且会给客户端和服务器带来负担。这就是去抖和巧妙的状态管理发挥作用的地方。在本文中,我们将构建一个自定义 React 钩子,通过合并有效负载和去抖 API 调用来捕获...
    编程 发布于2024-11-07
  • 我们走吧!
    我们走吧!
    为什么你需要尝试 GO Go 是一种快速、轻量级、静态类型的编译语言,非常适合构建高效、可靠的应用程序。它的简单性和简洁的语法使其易于学习和使用,特别是对于新手来说。 Go 的突出功能包括内置的 goroutine 并发性、强大的标准库以及用于代码格式化、测试和依赖管理的强大工具。...
    编程 发布于2024-11-06
  • 如何将 PNG 图像编码为 CSS 数据 URI 的 Base64?
    如何将 PNG 图像编码为 CSS 数据 URI 的 Base64?
    在 CSS 数据 URI 中对 PNG 图像使用 Base64 编码为了使用数据 URI 将 PNG 图像嵌入到 CSS 样式表中,PNG 数据必须首先编码为 Base64 格式。此技术允许将外部图像文件直接包含在样式表中。Unix 命令行解决方案:base64 -i /path/to/image....
    编程 发布于2024-11-06
  • API 每小时数据的响应式 JavaScript 轮播
    API 每小时数据的响应式 JavaScript 轮播
    I almost mistook an incomplete solution for a finished one and moved on to work on other parts of my weather app! While working on the carousel that w...
    编程 发布于2024-11-06
  • 用于 Web 开发的 PHP 和 JavaScript 之间的主要区别是什么?
    用于 Web 开发的 PHP 和 JavaScript 之间的主要区别是什么?
    PHP 与 JavaScript:服务器端与客户端 PHP 的作用与 JavaScript 不同。 PHP 运行在服务器端。服务器运行应用程序。除其他外,它还处理表单。当您提交表单时,PHP 会对其进行处理。另一方面,JavaScript 是客户端的。它在浏览器中运行。它处理页面交...
    编程 发布于2024-11-06
  • 如何在 C++ 中迭代结构和类成员以在运行时访问它们的名称和值?
    如何在 C++ 中迭代结构和类成员以在运行时访问它们的名称和值?
    迭代结构体和类成员在 C 中,可以迭代结构体或类的成员来检索它们的名称和价值观。以下是实现此目的的几种方法:使用宏REFLECTABLE 宏可用于定义允许自省的结构。该宏将结构体的成员定义为以逗号分隔的类型名称对列表。例如:struct A { REFLECTABLE ( ...
    编程 发布于2024-11-06
  • 如果需要准确答案,请避免浮动和双精度
    如果需要准确答案,请避免浮动和双精度
    float 和 double 问题: 专为科学和数学计算而设计,执行二进制浮点运算。 不适合货币计算或需要精确答案的情况。 无法准确表示10的负次方,例如0.1,从而导致错误。 示例1: 减去美元金额时计算错误: System.out.println(1.03 - 0.42); // Result...
    编程 发布于2024-11-06
  • 在 Go 中使用 WebSocket 进行实时通信
    在 Go 中使用 WebSocket 进行实时通信
    构建需要实时更新的应用程序(例如聊天应用程序、实时通知或协作工具)需要一种比传统 HTTP 更快、更具交互性的通信方法。这就是 WebSockets 发挥作用的地方!今天,我们将探讨如何在 Go 中使用 WebSocket,以便您可以向应用程序添加实时功能。 在这篇文章中,我们将介绍: WebSoc...
    编程 发布于2024-11-06
  • 如何在 Python 中使用代理运行 Selenium Webdriver?
    如何在 Python 中使用代理运行 Selenium Webdriver?
    使用 Python 中的代理运行 Selenium Webdriver当您尝试将 Selenium Webdriver 脚本导出为 Python 脚本并从命令行执行时,可能会遇到在使用代理的情况下出现错误。本文旨在解决此问题,提供一种使用代理有效运行脚本的解决方案。代理集成要使用代理运行 Selen...
    编程 发布于2024-11-06
  • || 什么时候运算符充当 JavaScript 中的默认运算符?
    || 什么时候运算符充当 JavaScript 中的默认运算符?
    理解 || 的目的JavaScript 中非布尔操作数的运算符在 JavaScript 中,||运算符通常称为逻辑 OR 运算符,通常用于计算布尔表达式。但是,您可能会遇到 || 的情况。运算符与非布尔值一起使用。在这种情况下,||运算符的行为类似于“默认”运算符。它不返回布尔值,而是根据某些规则返...
    编程 发布于2024-11-06
  • 探索 Java 23 的新特性
    探索 Java 23 的新特性
    亲爱的开发者、编程爱好者和学习者, Java 开发工具包 (JDK) 23 已正式发布(2024/09/17 正式发布),标志着 Java 编程语言发展的又一个重要里程碑。此最新更新引入了大量令人兴奋的功能和增强功能,旨在改善开发人员体验、性能和模块化。 在本文中,我将分享 JDK 23 的一些主要...
    编程 发布于2024-11-06
  • ES6 数组解构:为什么它没有按预期工作?
    ES6 数组解构:为什么它没有按预期工作?
    ES6 数组解构:不可预见的行为在 ES6 中,数组的解构赋值可能会导致意外的结果,让程序员感到困惑。下面的代码说明了一个这样的实例:let a, b, c [a, b] = ['A', 'B'] [b, c] = ['BB', 'C'] console.log(`a=${a} b=${b} c=$...
    编程 发布于2024-11-06

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3