Django web架构学习(四)

in Python with 0 comment

数据库操作

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信息,如下图展示
1.png

python manage.py createsuperuser #创建用户,就可以登录后台进行管理,添加数据

2.png

登陆查看数据库信息:

3.png

进入表查看数据信息:
4.png

注意:以上显示的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.png

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.png

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>

访问结果如下图:
7.png

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 }}

参照之前写过的flask模板

获取当前 GET 参数:{{ request.GET.urlencode }}
合并到一起用的一个例子:<a href="{{ request.path }}?{{ request.GET.urlencode }}&delete=1">当前网址加参数 delete</a>

文章参考地址:https://www.cnblogs.com/yangmv/p/5327477.html

Responses