Django源码解析|Migrations文件的生成
背景
这其实是Django源码视频中的一个细节。
当我们创建好一个Model之后,需要执行makemigrations操作,生成对应的Migrations文件。那么问题来了,Django是如何把Model生成对应的Migrations文件的呢?
比如Mode定义如下:
from django.db import models
class Post(models.Model):
title = models.CharField(max_length=100)
created_time = models.DateTimeField(auto_now_add=True)
生成的Migrations如下:
from django.db import migrations, models
class Migration(migrations.Migration):
initial = True
dependencies = [
]
operations = [
migrations.CreateModel(
name='Post',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('title', models.CharField(max_length=100)),
('created_time', models.DateTimeField(auto_now_add=True)),
],
),
]
其实我们关心的是operations里面的内容。
需要注意的是,这个代码也是文本,是由Django生成的。
代码实现
视频里虽然讲解了,不过最好大家还是能够自己实现一个简单的逻辑,这样才能掌握更多技巧和库的用法。话不多说,我们直接上代码,实现一个小的Demo。
上面代码的核心是通过inspect对拿到的类实例(也就是:foo)进行解析,整体逻辑不难理解。
很多人觉得这个定义已然存在了,为什么还要通过代码来写一遍。关键问题在于,我们需要站在机器的视角来看问题。机器拿到的只是一个对象,它需要做的是把对象转换为文本。
日本服务器相关资讯可以参考官网。
背景
这其实是Django源码视频中的一个细节。
当我们创建好一个Model之后,需要执行makemigrations操作,生成对应的Migrations文件。那么问题来了,Django是如何把Model生成对应的Migrations文件的呢?
比如Mode定义如下:
from django.db import models
class Post(models.Model):
title = models.CharField(max_length=100)
created_time = models.DateTimeField(auto_now_add=True)
生成的Migrations如下:
from django.db import migrations, models
class Migration(migrations.Migration):
initial = True
dependencies = [
]
operations = [
migrations.CreateModel(
name='Post',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('title', models.CharField(max_length=100)),
('created_time', models.DateTimeField(auto_now_add=True)),
],
),
]
其实我们关心的是operations里面的内容。
需要注意的是,这个代码也是文本,是由Django生成的。
代码实现
视频里虽然讲解了,不过最好大家还是能够自己实现一个简单的逻辑,这样才能掌握更多技巧和库的用法。话不多说,我们直接上代码,实现一个小的Demo。
上面代码的核心是通过inspect对拿到的类实例(也就是:foo)进行解析,整体逻辑不难理解。
很多人觉得这个定义已然存在了,为什么还要通过代码来写一遍。关键问题在于,我们需要站在机器的视角来看问题。机器拿到的只是一个对象,它需要做的是把对象转换为文本。
日本服务器相关资讯可以参考官网。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,请发送邮件至 ZLME@ZLME.COM 举报,一经查实,立刻删除。