Django ORM
# 即对象关系模型
# 类——表
# 对象——记录
# 对象属性(值)——记录某个字段(值)
#在models.py中写一个类
class User(models.Model):
id = models.AutoField(primary_key=True)
username = models.CharField(max_length=100) #CharField必须指定长度
password = models.CharField(max_length=100, verbose_name = '密码') #verbose_name即字段名注释
# 数据库迁移命令,只要修改了models.py中关于数据库的代码就要执行以下两条迁移数据
python manage.py makemigrations #将操作记录记录到migrations文件夹
python manage.py migrate #将操作同步到数据库中
# 当没有定义主键时,ORM会自动创建一个id字段作为主键
字段的增删改查
# 在原有的类中添加属性
class User(models.Model):
id = models.AutoField(primary_key=True)
username = models.CharField(max_length=100)
password = models.CharField(max_length=100)
age = models.IntegerField(verbose_name='年龄')
# 在迁移中给出新建字段默认值
info = models.CharField(max_length=100, verbose_name='个人信息', null=True)
hobby = models.CharField(max_length=100, verbose_name='爱好', default='read')
# 修改字段
直接改类代码,然后执行迁移
# 删除字段
直接删除类中设计的字段,然后迁移
数据的增删改查
# 数据查询 eg:views.py
username = request.POST.get('username')
password = request.POST.get('password')
res = models.User.objects.filter(username=username)
#返回列表[User对象1,User对象2,User对象3]
data = models.User.objects.filter() #查询所有
user_queryset = models.User.objects.all() #查询所有
# 数据增加
def register(request):
if request.method == "POST":
username = request.POST.get('username')
password = request.POST.get('password')
if models.User.objects.filter(username=username):
return HttpResponse('用户名已存在,请使用其他用户名注册')
res = models.User.objects.create(username=username,password=password)
return HttpResponse(f'用户{res.username}注册成功')
return render(request, 'register.html')
# 或
user_obj = models.User(username=username,password=password)
user_obj.save()
# 数据编辑
'''
<tbody>
{% for user_obj in user_queryset %}
<tr>
<td>{{ user_obj.id }}</td>
<td>{{ user_obj.username }}</td>
<td>{{ user_obj.password }}</td>
<td>{{ user_obj.age }}</td>
<td>{{ user_obj.hobby }}</td>
<td>{{ user_obj.info }}</td>
<td> ***通过网页后缀传递user_id信息给编辑路由***
<a href="/edit_user/?user_id={{ user_obj.id }}" class="btn btn-success btn-xs">编辑</a>
<a href="/del_user/" class="btn btn-danger btn-xs">删除</a>
</td>
</tr>
{% endfor %}
</tbody>
'''
def edit_user(request):
edit_id = request.GET.get('user_id')
if request.method == 'POST':
username = request.POST.get('username')
password = request.POST.get('password')
age = request.POST.get('age')
hobby = request.POST.get('hobby')
info = request.POST.get('info')
# 批量更新
models.User.objects.filter(id=edit_id).update(username=username,\
password=password,age=age,hobby=hobby,info=info)
return redirect('/userlist/')
edit_obj = models.User.objects.filter(id=edit_id).first()
return render(request,'edit_user.html',{'edit_obj':edit_obj})
# 数据删除
def del_user(request):
del_id = request.GET.get('user_id')
models.User.objects.filter(id=del_id).delete() #批量删除
return redirect('/userlist/')
# 删除数据并不是真正的内部删除,而是修改该记录的特殊标识字段的值
创建表关系
'''
表关系:一对一、一对多、多对多
判断方法:换位思考,单向一对多即一对多,双向一对多即多对多,双向一对一即一对一
'''
# 图书表 作者表 出版社表 作者详情表
# 出版社和图书是一对多的关系,外键建在图书表
# 作者和图书是多对多的关系,应该手动创建新表-图书作者关系表:book2author,id,book_id,author_id
# 作者与作者详情是一对一的关系
# 创建表关系,先创建基表,再添加外键字段,最后一起迁移
from django.db import models
# Create your models here.
class Book(models.Model):
title = models.CharField(max_length=32)
price = models.DecimalField(max_digits=8, decimal_places=2)
# 出版社和图书是一对多的关系,外键建在图书表
publish = models.ForeignKey(to='Publish') #默认与目的表主键关联
# 图书和作者是多对多的关系,本应新建二者关系表,在django中,外键字段建在查询频率较高的一方
# ForeignKey对应的字段会在字段名后加'_id'生成最终的字段名
authors = models.ManyToManyField(to='Author') # 虚拟字段,告诉ORM图书与作者多对多的关系
# ORM会自动创建二者关系新表,创建时使用两张表的主键
class Publish(models.Model):
name = models.CharField(max_length=32)
addr = models.CharField(max_length=64)
class Author(models.Model):
name = models.CharField(max_length=32)
age = models.IntegerField()
# 作者与作者详情是一对一的关系,外键应建在查询频率较高的表
# OneToOneField对应的字段也会在字段名后加'_id'生成最终的字段名
author_details = models.OneToOneField(to='AuthorDetails')
class AuthorDetails(models.Model):
phone = models.CharField(max_length=32)
addr = models.CharField(max_length=64)
# 在django 1.x版本中,数据库外键都是默认级联更新、级联删除的。