Django定义和使用模型

学习动力
我今年的项目主要基于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是会保护我们的数据的,我们可以放心的去做啦。

使用模型
总结

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值