数据库操作
django中每一个模型model都对应于数据库中的一张表,每个模型中的字段都对应于数据库表的列。django可以自动生成这些create table, alter table, drop table的操作。上篇文章我也大致介绍了下Model与数据库的一些交互,下面我们详细讲下一些常用操作。
1.创建Model表
#cat models.py
from django.db import models
class linuxtest(models.Model):
name = models.CharField(max_length=100, null=False)
address = models.TextField(null=False)
age = models.IntegerField(null=False)
email = models.EmailField(null=False)
更多参数:
models.AutoField | 自增列= int(11),如果没有的话,默认会生成一个名称为 id 的列,如果要显示的自定义一个自增列,必须将给列设置为主键 primary_key=True。 |
models.CharField | 字符串字段,必须 max_length 参数 |
models.BooleanField | 布尔类型=tinyint(1),不能为空,Blank=True |
models.ComaSeparatedIntegerField | 用逗号分割的数字=varchar,继承CharField,所以必须 max_lenght 参数 |
models.DateField | 日期类型 date,对于参数,auto_now =True则每次更新都会更新这个时间;auto_now_add 则只是第一次创建添加,之后的更新不再改变。 |
models.DateTimeField | 日期类型 datetime,同DateField的参数 |
models.Decimal | 十进制小数类型= decimal,必须指定整数位max_digits和小数位decimal_places |
models.EmailField | 字符串类型(正则表达式邮箱)=varchar,对字符串进行正则表达式 |
models.FloatField | 浮点类型= double |
models.IntegerField | 整形 |
models.BigIntegerField | 长整形integer_field_ranges ={'SmallIntegerField':(-32768,32767),'IntegerField':(-2147483648,2147483647),'BigIntegerField':(-9223372036854775808,9223372036854775807),'PositiveSmallIntegerField':(0,32767),'PositiveIntegerField':(0,2147483647),} |
models.IPAddressField | 字符串类型(ip4正则表达式) |
models.GenericIPAddressField | 字符串类型(ip4和ip6是可选的),参数protocol可以是:both、ipv4、ipv6,验证时,会根据设置报错 |
models.NullBooleanField | 允许为空的布尔类型 |
models.PositiveIntegerFiel | 正Integer |
models.PositiveSmallIntegerField | 正smallInteger |
models.SlugField | 减号、下划线、字母、数字 |
models.SmallIntegerField | 数字;数据库中的字段有:tinyint、smallint、int、bigint |
models.TextField | 字符串=longtext |
models.TimeField | 时间 HH:MM[:ss[.uuuuuu]] |
models.URLField | 字符串,地址正则表达式 |
models.BinaryField | 二进制 |
models.ImageField | 图片 |
models.FilePathField | 文件* |
2.注册APP
执行命令python manage.py makemigrations
,会提示No changes detected
,这是因为:执行命令时会找所有models,但是django不知道找哪个,所有需要指定一下。
#cat settings.py
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'linux', # 这里添加app,直接写项目名
]
3.生成表结构
python manage.py makemigrations # 生成migrations临时文件
python manage.py migrate # 根据migrations直接生成数据库
执行后,从migrations便会产生操作记录。生成数据库,默认情况下用的sqlite3。可以用navicat等软件直接打开。db.sqlite3里面包含缓存、session、cookie、静态文件以及后台管理。像咱们创建的表名叫:linux_linuxtest
一般我们使用mysql数据库较多,设置mysql数据库同样参考上篇文章,有相关mysql设置。
4.admin后台注册表
在admin.py写入新增的model信息,如下图展示:
python manage.py createsuperuser #创建用户,就可以登录后台进行管理,添加数据
登陆查看数据库信息:
进入表查看数据信息:
注意:以上显示的linuxtest object (3),linuxtest object (4)分别对应的表里的两行数据,为了更友好的展示出来,我们需要修改注册调用。添加如下代码:
#cat admin.py
from django.contrib import admin
from linux import models
class LinuxTestAdmin(admin.ModelAdmin): ##创建新的类,在浏览器中展示下面的两个字段
list_display = ('name', 'email')
admin.site.register(models.linuxtest, LinuxTestAdmin) ##注册上面新增的类
访问结果如下图:
5.数据库增删改查操作
增:
def adddata(request):
a = linuxtest(name='wj', address='jsndfgn', age=19, email='52222hkl@qq.com')
a.save()
return HttpResponse('已经添加数据')
删:
def deletedata(request):
a = linuxtest.objects.first()
a.delete()
return HttpResponse('已经删除数据')
改:
a = linuxtest.objects.all().update(age=30) ##修改所有字段的值
b = linuxtest.objects.filter(id=3).update(email='73er23@163.com') #修改指定id为3的值
查:
models.linuxtest.objects.all()
models.linuxtest.objects.all().values('user') #只取user列
models.linuxtest.objects.all().values_list('id','user') #取出id和user列,并生成一个列表
models.linuxtest.objects.get(id=1)
models.linuxtest.objects.get(user='yangmv')
示例:
def selectdata(request):
a = linuxtest.objects.all()
# b = a.values('email')
# c = a.values_list('id', 'name')
# d = linuxtest.objects.get(id=4)
# e = linuxtest.objects.get(name='lisi')
return render(request, 'html/show.html', {'name_list': a})
cat html/showlist.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>show</title>
</head>
<body>
<div>
<table border="1">
<thead>
<tr>
<th>用户名</th>
<th>年龄</th>
</tr>
</thead>
<tbody>
{% for line in name_list %}
<tr>
<td>{{ line.name }}</td>
<td>{{ line.age }}</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
</body>
</html>
浏览器访问地址效果如下:
6.修改表结构
例1:修改列
name = models.CharField(max_length=100, null=False)
改为name = models.CharField(max_length=120, null=False)
例2:增加一列
email = models.EmailField(null=False) ##原来存在的字段
email2 = models.EmailField(max_length=32, null=True)
表结构修改后,原来表中已存在的数据,就会出现结构混乱,makemigrations更新表的时候就会出错。
解决方法:
新增加的字段,设置允许为空。生成表的时候,之前数据新增加的字段就会为空。(null=True允许数据库中为空,blank=True允许admin后台中为空);
新增加的字段,设置一个默认值。生成表的时候,之前的数据新增加字段就会应用这个默认值;
执行makemigrations, migrate 后。老数据会自动应用新增加的规则。
模板
- 模板变量
语法: {{变量名}}
命名规则: 由字母和数字及下划线组成,不能以空格和标点符号命名
传入类型: 可以是字符串,字典, 类, 函数, 列表等形式。
- 字符串
cat views.py
def data(request):
string = "hello world"
return render(request, 'test.html', {'string': string})
cat test.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>test</title>
</head>
<body>
{{ string }}
</body>
</html>
访问结果如下图:
- 列表
views.py
def data2(request):
testlist= ["a", "b", "b", "d", "e"]
return render(request, 'test2.html', {'testlist': testlist})
cat test2.html
{% for i in testlist%}
{{ i }}
{% endfor %}
- 显示字典内容
cat views.py
def test3(request):
test_dict = {'a': 'sd1', 'b': '3dsd'}
return render(request, 'test3.html', {'test_dict': test_dict})
cat test3.html
{% for key, value in test_dict.items %}
{{ key }}: {{ value }}
{% endfor %}
或者:
a:{{ test_dict.a }} b:{{ test_dict.b }}
- 模板继承等用法
- 其他用法
获取当前网址:{{ request.path }}
获取当前 GET 参数:{{ request.GET.urlencode }}
合并到一起用的一个例子:<a href="{{ request.path }}?{{ request.GET.urlencode }}&delete=1">当前网址加参数 delete</a>
文章参考地址:https://www.cnblogs.com/yangmv/p/5327477.html
本文由 Mr Gu 创作,采用 知识共享署名4.0 国际许可协议进行许可
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名
最后编辑时间为: Mar 16, 2018 at 10:48 am