数据输入
从谷歌电子表格自动更新Django模型
一个现成的Python教程,教你如何直接从谷歌电子表格中创建和更新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
它应该给出以下输出:
最后:
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
在那里我可以看到我的表和添加新的记录:
本教程的所有代码都可以从我的Github库。