一、django模型层用于创建和存储数据,模型的基础知识。
- 每个模型是python的一个类,继承django.db.models.Model类
- 每个模型对应数据库中一张表,模型的每个属性,对应表中的一个字段
- django有一套访问数据库的API
二、创建模型
from django.db import models
# Create your models here.
#发布会表
class Event(models.Model):
name = models.CharField(max_length=100) #发布会标题
limit = models.IntegerField() # 参加发布会人数
status = models.BooleanField() # 状态
address = models.CharField(max_length=200) # 发布会地址
start_time = models.DateTimeField('event time') # 发布会开始时间
create_time = models.DateTimeField(auto_now=True) # 发布会创建时间,自动获取
def __str__(self):
return self.name
#嘉宾表
class Guest(models.Model):
# 关联发布会id,models.CASCADE当主表字段被删除时,和它有关的子表字段也会被删除
event = models.ForeignKey(Event,on_delete=models.CASCADE)
realname = models.CharField(max_length=64) # 姓名
phone = models.CharField(max_length=16) # 手机号
email = models.EmailField() # email
sign = models.BooleanField() # 签到状态
create_time = models.DateTimeField(auto_now=True) # 创建时间,自动获取
class Meta:
unique_together = ("event","phone")
def __str__(self):
return self.realname
模型创建成功后,需要在dos命令行执行如下命令完成数据库迁移:
python manage.py makemigrations 应用名
python manage.py migrate
ForeignKey用来创建外键。
Meta是django模型类的内部类,用于定义一些的django模型的行为特性,unique_together用于设置两个字段的联合主键。
__str()__方法考苏python如何将对象已str的方式显示出来。
类型 | 说明 |
---|---|
AutoFiled | 一个IntegerFiled类型的自动增量 |
BooleanFiled | 用于存放布尔类型的数据(true or false) |
CharFiled | 用于存放字符型数据,需要指定长度max_length |
DateFiled | 日期类型,必须为“YY-MM-DD”格式 |
DateTimeFiled | 日期时间类型,必须为“YY-MM-DD HH:MM[:ss[.uuuuuu]][TZ]”格式 |
FloatFiled | 用于存放浮点型数据 |
IntegerFiled | 用于存放整型数据,范围-2147483648到2147483647 |
FilePathFiled | 文件路径类型 |
TextFiled | 用于存放文本类型数据 |
三、基本数据访问
- 插入数据:table.objects.create(),示例如下:
#Event为表对应的python类,create方法的参数及值为类属性及属性对象的值 Event.objects.create(name=name, limit=limit, status=status, address=address, start_time=start_time, create_time=create_time)
- 查询数据:table.objects.get(查询条件)精确匹配,返回对象列表。搜索结果为空时,会抛DoesNotExist类型错误。 table.objects.filter(查询条件)模糊匹配,返回对象列表,不存在时,返回空列表。 table.objects.all()用于查询表中的所有数据。示例如下:
#查找电话为18711111111并且event_id为1的数据,get方法是从数据库中取一个匹配的结果,要是为空或多于1个,都会报错 Guest.objects.get(phone=18711111111, event_id=1) #查找电话包含187的数据 Guest.objects.filter(phone__contains=187) #查询表中的所有数据 Guest.objects.all()
- 删除数据:table.objects.get(查询条件).delete(查询条件)或table.objects.filter().delete()用于删除查询到的数据。示例如下:
#删除电话为18711111111并且event_id为1的数据 Guest.objects.get(phone=18711111111, event_id=1).delete() #删除电话包含187的数据 Guest.objects.filter(phone__contains=187).delete()
- 更新数据:table.objects.select_for_update().fliter(查询条件).update(更新字段=更新值)用于更新特定条件下的字段。示例如下:
#将电话包含187且event_id为1的数据的sign字段的值都更新为1 Guest.objects.filter(phone=187,event_id=1).update(sign="1")