Django定义和使用模型
admin
2023-07-31 01:44:47
0

学习动力
我今年的项目主要基于Django开发,学习了很多新东西。我很多时候,担心日后会忘记很多有趣的东西,我想写下笔记。但是从哪个方面入手,我没有思路。所以查看了一些书,根据目录进行总结。希望自己不会错过什么!

定义模型
为什么使用ORM
Django丰富的变量类型

为了简单,我直接编写和官网一样的例子。

from django.db import models

class Person(models.Model):
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=30)

我直接使用makemigrations命令的话,我们可以查看myapp里面有个migrates目录。

from __future__ import unicode_literals

from django.db import migrations, modelsclass 

Migration(migrations.Migration):

    dependencies = [ 
    ]   

    operations = [ 
        migrations.CreateModel(
            name=\'Person\',
            fields=[
                (\'id\', models.AutoField(verbose_name=\'ID\', serialize=False, auto_created=True, primary_key=True)),
                (\'first_name\', models.CharField(max_length=30)),
                (\'last_name\', models.CharField(max_length=30)),
            ],  
        ),  
    ] 

从上面的代码可以看出,系统不仅仅给生成first_name,last_name还有id,它的类型是AutoField类,既然学习的是类型的定义,那我现在可以在自己的脑海中留下一个思维图。

好啦!我现在有几个问题:
1)我一定要生成id吗?
2)我可以修改CharField的max_length属性,还能修改什么属性?
3)migrations.Migration又是一个什么样子的类呢?
现在执行migrate然后查看sqlite生成的表格。

CREATE TABLE \"myapp_person\" (\"id\" integer NOT NULL PRIMARY KEY AUTOINCREMENT, \"first_name\" varchar(30) NOT NULL, \"last_name\" varchar(30) NOT NULL);

现在又有几个问题:
1)为什么表被命名为myapp_person,我们并没有在哪设置这个名字啊?
2)我们能否使用别的域作为主键?
3)我们能否自定义表名?
答案如下:
1),3) 可以参考这里
我们来试试看,如何设置Meta类里面的属性,来改变我们的表名。

class Person(models.Model):
    #Rest of code  
    class Meta:
        db_table = \'new_table\'

执行makemigrations我们会在终端得到下面的信息。

查看我们的0002文件,得到如下的内容。

from __future__ import unicode_literals

from django.db import migrations, models


class Migration(migrations.Migration):

    dependencies = [ 
        (\'myapp\', \'0001_initial\'),
    ]   

    operations = [ 
        migrations.AlterModelTable(
            name=\'person\',
            table=\'new_table\',
        ),  
    ]  

从上面生成的代码可以看出,django并不是从新生成数据库的各个域,只是修改名字而已,与我们平时使用sql语句的做法应该是一致的。继续运行migrate我们查看生成的sql语句如下:

CREATE TABLE \"new_table\" (\"id\" integer NOT NULL PRIMARY KEY AUTOINCREMENT, \"first_name\" varchar(30) NOT NULL, \"last_name\" varchar(30) NOT NULL);

的确,是从新改写了表名,我们得到了新的表名,那么如果里面已经存有数据,该表名会删除数据吗?为了,进一步测试,我们先把这个类注册到admin中。

from django.contrib import admin

from .models import Person

admin.site.register(Person)

记住,别忘记创建管理员账户。创建后就可以在管理员里面增加数据到person类啦。
然后,我们再修改Meta的名字,看看数据是否会被删除。

现在,数据为这个。我们试着从新把表名改了(改回系统默认的)

class Migration(migrations.Migration):

    dependencies = [ 
        (\'myapp\', \'0002_auto_20151213_0903\'),
    ]   

    operations = [ 
        migrations.AlterModelTable(
            name=\'person\',
            table=\'myapp_person\',
        ),  
    ]  

我们这次,查看到系统是更加第二次修改的记录进行的,我们继续看看我们的数据是否丢失。

数据还在,说明我们的django是会保护我们的数据的,我们可以放心的去做啦。

使用模型
总结

相关内容

热门资讯

Mobi、epub格式电子书如... 在wps里全局设置里有一个文件关联,打开,勾选电子书文件选项就可以了。
定时清理删除C:\Progra... C:\Program Files (x86)下面很多scoped_dir开头的文件夹 写个批处理 定...
scoped_dir32_70... 一台虚拟机C盘总是莫名奇妙的空间用完,导致很多软件没法再运行。经过仔细检查发现是C:\Program...
500 行 Python 代码... 语法分析器描述了一个句子的语法结构,用来帮助其他的应用进行推理。自然语言引入了很多意外的歧义,以我们...
小程序支付时提示:appid和... [Q]小程序支付时提示:appid和mch_id不匹配 [A]小程序和微信支付没有进行关联,访问“小...
pycparser 是一个用... `pycparser` 是一个用 Python 编写的 C 语言解析器。它可以用来解析 C 代码并构...
微信小程序使用slider实现... 众所周知哈,微信小程序里面的音频播放是没有进度条的,但最近有个项目呢,客户要求音频要有进度条控制,所...
65536是2的几次方 计算2... 65536是2的16次方:65536=2⁶ 65536是256的2次方:65536=256 6553...
Apache Doris 2.... 亲爱的社区小伙伴们,我们很高兴地向大家宣布,Apache Doris 2.0.0 版本已于...
项目管理和工程管理的区别 项目管理 项目管理,顾名思义就是专注于开发和完成项目的管理,以实现目标并满足成功标准和项目要求。 工...