数据输入

从谷歌电子表格自动更新Django模型

一个现成的Python教程,教你如何直接从谷歌电子表格中创建和更新Django模型

从谷歌电子表格自动更新Django模型
作者图片

数据模型定义和数据模型实现通常由不同的人执行,数据模型定义中的一点更改应尽快转换为已实现的模型。

将模型中的更改转换为实现的速度取决于定义和实现如何相互关联。

在本教程中,我提出了一种直接将模型中的更改转换为实现中的更改的机制。我利用以下工具:

  • 谷歌电子表格以获取数据模型定义
  • Python将电子表格中的更改转换为Django的更改
  • Django在Web界面中呈现模型。

通过谷歌电子表格自动更新Django中的数据模型需要三个步骤:

  • 数据模型定义在b谷歌电子表格
  • 模型的翻译从谷歌电子表格到Django模型
  • 模型更新在Django

1数据模型定义

首先,我定义了一个基本的数据模型。例如,我可以考虑三个表:

  • 人(id、名称、姓氏、生日、性别)
  • 组织(id、名称、地址、网站、位置)
  • 员工(person_id organization_id)

然后,我创建一个新的谷歌电子表格,并为每个表分配一个工作表,如下所示这个例子。对于每个表,我定义了以下列:

  • 属性- - - - - -表的属性列表
  • 描述-属性表示什么
  • 数据类型-属性数据类型
  • 最大长度- char类型变量的最大长度。它只对char属性有效
  • 关键-指定属性是键(主键还是外键)
  • 外键表—如果属性是外键,则指定关联的表

下图显示了Person表的构建表:

谷歌电子表格示例
作者图片

数据模型可以由模型设计器动态更新,而无需考虑任何实现。他们甚至可以向电子表格中添加其他表格,或者通过添加或删除属性来修改现有的表格。

模型设计器尊重表的结构就足够了。

模型转换为Django模型

下一步涉及到从谷歌电子表格到Django的模型转换。这可以通过使用谷歌电子表格的内容动态构建Django模型来实现。在实践中,我可以写一个Python代码,生成Djangomodel.py脚本运行,取决于谷歌电子表格。

模型翻译可以通过三个步骤来实现:

  • 阅读谷歌电子表格
  • 创建表和Django模型类之间的映射
  • 创建的内容model.py脚本

2.1阅读谷歌电子表格

我之前的文章,我描述了如何在Python中加载谷歌文档的内容。关于谷歌电子表格,身份验证过程非常相似,不同之处在于谷歌电子表格API应该在谷歌控制台中启用,而不是谷歌文档API。

为了完整起见,我在这里报告用于身份验证的Python代码:

从__future__导入print_function
进口os.path
从googleapiclient。发现导入构建
从google_auth_oauthlib。导入installdappflow
从google.auth.transport.requests导入请求
从google.oauth2。凭证导入凭证
#如果修改这些作用域,请删除token.json文件。
scope = ['https://www.googleapis.com/auth/spreadsheets.readonly的
示例电子表格的ID和范围。
Spreadsheet_id = '您的文档id '
creds =无
#文件令牌。Json存储用户的访问和刷新令牌,并在授权流第一次完成#时自动创建。
如果os.path.exists(“token.json”):
creds = Credentials.from_authorized_user_file('token.json', SCOPES)
#如果没有可用的(有效)凭据,让用户登录。
如果没有信用或没有信用有效:
如果信和信。过期和creds.refresh_token:
creds.refresh(请求())
其他:
flow = InstalledAppFlow.from_client_secrets_file(
的凭证。json,范围)
Creds = flow.run_local_server(端口=0)
#保存凭据以供下次运行
张开(“令牌。Json ', 'w')作为token:
token.write (creds.to_json ())

通过身份验证后,我可以加载谷歌电子表格的内容:

Service = build('sheets', 'v4',凭据=creds)
Sheet = service.spreadsheets()
sheet_metadata = service.spreadsheets().get(SPREADSHEET_ID =SPREADSHEET_ID).execute()

并将其转换为Pandas Dataframe的字典。实际上,字典中的每一项都是谷歌电子表格的一个表,关联的键是表名:

Df_dict = {}属性= sheet_metadata.get('sheets')对于属性中的项:
Table = item.get('properties').get('title')
df_dict[table] = pd.DataFrame()

result = sheet.values().get(spreadsheetId=SPREADSHEET_ID,
range=table + '!A1:F').execute()
Header = result。get(“值”,[])[0]

Values = result。get(“值”,[])(1:)
如果不是,值:
print('找不到数据')
其他:
All_data = []
对于col_id, col_name在enumerate(header):
Column_data = []
对于行中的值:
如果col_id < len(row):
column_data.append(行[col_id])
其他:
column_data.append (")
Ds = pd。系列(数据= column_data名称= col_name)
all_data.append (ds)
Df_dict [table] = pd。concat (all_data轴= 1)

2.2创建表和Django模型类之间的映射

这一步可以很容易地通过构建一个表来实现,它将每个数据框的列映射到Django模型类的属性:

表= {}
对于表,df在df_dict.items()中:
table [table] = {}
对于I在range(0, df.shape[0]):
属性= {}
attr['default'] = 'None'
if df['MAX LENGTH'][i] != ":
attr['max_length'] = df['MAX LENGTH'][i]
if df['KEY'][i] == '主键':
attr['primary_key'] = 'True'
表(表][df['属性'][我]]= [df(“数据类型”)[我],attr]

它产生以下输出:


": {
id”:[“整数”{“默认”:“没有”,“primary_key”:“真正的”}),
名字”(“字符”,:{“默认”:“没有”,“max_length”:“32”}),
”(“字符”,:{“默认”:“没有”,“max_length”:“32”}),
生日': ['Date', {'default': 'None'}],
”。:【“字符”,{“默认”:“没有”,“max_length”:' 1 '})},
组织": {
id”:[“整数”{“默认”:“没有”,“primary_key”:“真正的”}),
名字”(“字符”,:{“默认”:“没有”,“max_length”:“64 '}),
地址”(“字符”,:{“默认”:“没有”,“max_length”:“128 '}),
网站”(“字符”,:{“默认”:“没有”,“max_length”:“128 '}),
位置”(“字符”,:{“默认”:“没有”,“max_length”:“64年}]},
工作人员”。: {
person_id': ['Integer', {'default': 'None'}],
organization_id': ['Integer', {'default': 'None'}]}
}

在实践中,对于每个表,构建属性列表,对于每个属性,表列被转换为Django模型属性。

2.3创建model.py脚本

模型翻译的最后一步是动态生成模型model.py脚本。

我定义了一个函数来解析前一个表中的每一项,并在Django类中为每个属性构建代码:

defget_type(attr_type):
如果isinstance(attr_type, list):
attr = attr_type[0] + 'Field('
对于attr_type[1].items()中的k,v:
Attr = Attr + k + '=' + v + ','
Attr = Attr [:-1]
返回attr + (')\n')
其他:
返回attr_type + 'Field()\n'

然后构建一个字符串,它将包含model.py文件。我用静态代码初始化它:

Script = 'from django.db import models\n'

然后,我为表中的每一项构建一个Django Model类:

对于model, tables.items()中的属性:
script = script + "class " + model + "(models.Model):\n"
对于attributes.items()中的attr_name、attr_type:
Script = Script + '\t' + attr_name + ' = models。+ get_type(attr_type)

最后将结果保存到文件中model.py

Root = 'mywebsite/myapp/'
File_name = root + 'models.py'
使用open(file_name, "w")作为py_file:
py_file.write(脚本)

3 Django中的模型更新

现在我已经准备好对Django进行修改了。我简单地运行以下命令:

Python3 manage.py makemigmigrations

它应该给出以下输出:

Django中python3 manage.py makemigration命令的输出
作者图片

最后:

Python3 manage.py migrate

这个命令应该把这三个表添加到数据库中:

Django表,由python3 manage.py migrate命令更新
作者图片

总结

在本教程中,我演示了如何从谷歌电子表格中自动更新Django模型。这个过程允许同步数据模型和数据实现,尽管这两个过程由不同的人管理。

如果你读了这么远,对我来说今天已经有很多了。谢谢!你可以在这篇文章

你愿意支持我的研究吗?

你可以每月花几美元订阅,然后解锁无限的文章点击这里

额外的奖金

我可以在Django中配置管理控制台,以便手动插入记录。这可以通过将每个创建的Model类注册到管理控制台来实现。我可以通过创建a自动完成admin.py脚本:

Script = """from django。贡献import admin\n从.models导入*
”“”
对于tables.keys()中的model:
Script = Script + "admin.site. "Register (" + model + ")\n"

然后,我可以保存文件:

File_name = root + 'admin.py'
使用open(file_name, "w",encoding='utf-8')作为py_file:
py_file.write(脚本)

然后,我可以再次应用迁移并创建一个新的超级用户:

Python3 manage.py makemigmigrations
Python3 manage.py migrate
Python3 manage.py创建超级用户

最后,我可以运行应用程序:

Python3 manage.py

并连接到管理控制台:

http://127.0.0.1:8000/admin

在那里我可以看到我的表和添加新的记录:

Django管理控制台。添加Person类的新记录
作者图片

本教程的所有代码都可以从我的Github库

相关文章

你的数据科学之家。共享概念、想法和代码的媒体出版物。

获得Medium应用程序

一个写着“在App Store上下载”的按钮,如果点击它,你就会进入iOS App Store
一个写着“Get it on,谷歌Play”的按钮,如果点击它,你就会进入谷歌Play商店
安吉莉卡·洛·杜卡

书的作者

研究员| +5万月浏览量|我写数据科学、Python、教程,偶尔也写Web应用|《Comet for Data Science》一书的作者

Baidu
map