1. 模型是您的数据唯一而且准确的信息来源,包含您正在储存的数据的重要字段和行为。一般来说,每一个模型都映射一个数据库表。
1.1 基础:
每个模型都是一个 Python 的类,这些类继承 django.db.models.Model
模型类的每个属性都相当于一个数据库的字段。
1.2 字段:
模型中最重要的、并且也是唯一必须的是数据库的字段定义。字段在类中定义。定义字段名时应小心避免使用与 models API</ref/models/instances>冲突的名称, 如 ``clean`, save, or ``delete``等.
1.3 字段类型:
Django内置了多种字段类型;如果Django内置类型不能满足你的需求,你可以很轻松地编写自定义的字段类型;
1.4 示例:
from django.db import models
# Create your models here.
class Article(models.Model):
title=models.CharField(verbose_name='文章标题',max_length=50)
desc = models.CharField(verbose_name='文章描述', max_length=100)
content = models.TextField(verbose_name='文章内容') #文本类型
img=models.ImageField(verbose_name='文章图片',null=True,blank=True,upload_to='./static')
show_count=models.IntegerField(verbose_name='查看次数',default=0)
# category=models.ForeignKey(Category,on_delete=models.DO_NOTHING()) #分类删除,文章不动
# category = models.ForeignKey(Category, on_delete=models.CASCADE()) # 分类删除的话,文章也删除。 级联
# category = models.ForeignKey(Category, on_delete=models.SET_DEFAULT()) #设置一个默认值
category = models.ForeignKey(Category, on_delete=models.PROTECT,verbose_name="分类") #受保护的
create_time=models.DateTimeField(verbose_name='创建时间',auto_now_add=True) #
update_time = models.DateTimeField(verbose_name='更新时间', auto_now=True) #
def __str__(self):
return self.title
class Meta:
# 上面的Article模型自动生成的默认表名为myapp_article,这里可以改写表名
db_table="article"
# 定义表名注释
verbose_name="文章"
verbose_name_plural=verbose_name
1.5 models扩展:
Models.py
1. 联合唯一: 字段url和category两个字段合起来需要唯一
class Meta:
db_table = "interface"
verbose_name = "接口"
verbose_name_plural = verbose_name
unique_together = ["url",'category'] #联合唯一
2. 定义一个表多个字段外键为同一个类时,需要related_name重命名
class Interface(models.Model):
create_user = models.ForeignKey(user_models.User, on_delete=models.SET(1), verbose_name="创建用户",related_name="c_user")
update_user = models.ForeignKey(user_models.User, on_delete=models.SET(1), verbose_name="修改用户",related_name="up_user")
3. 多个app的models引用时,名称一样,需要as重命名
from user import models as user_models
4. models.py里多个表类存在相同字段时,可以抽离为一个基础models用于继承。
(1)抽离一个公共基础models
from django.db import models
class BaseModel(models.Model):
create_time = models.DateTimeField(verbose_name="创建时间", auto_now_add=True)
update_time = models.DateTimeField(verbose_name="更新时间", auto_now=True)
class Meta:
abstract = True # 代表这个类只是继承的。不会被创建。
(2)然后models.py文件里的类继承即可,如下:
from common.custom_class import BaseModel
class PublicParam(BaseModel):
pass
2. 数据库的查询:
import os
import django
from order import models
# 使用django时通知django当前使用的是哪个配置文件 ;
# 选择文件夹lily_django/需要右键 - -MarkDirectory as--ResourceRoot
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'lily_django.settings')
django.setup()
#通过objects这个模型管理器的all()获得所有数据,为结果集:
print(models.Article.objects.all())
#结果返回<QuerySet [<Article: django模型>, <Article: Django 模板>]>
#打印所有记录的字段值
for obj in models.Article.objects.all():
print(obj.id,obj.name,obj.create_time,obj.update_time)
#get()方法获取当个对像,只能返回一条数据,返回多条会报错。且没有结果数据,会报错,使用需要捕捉异常
obj=models.Article.objects.get(id=1)
print(obj.id,obj.title,obj.create_time)
#filter()相当于sql中的where,结果为多条,为对象结果集。如果没有结果,则返回空
obj=models.Article.objects.filter(show_count=0)
for obj in models.Article.objects.filter(show_count=0):
#values()返回id和title两个字段的key-value结果集:
obj=models.Article.objects.values('id','title')
print(obj)
#values_list()返回id和title两个字段的value结果集:
obj=models.Article.objects.values_list('id','title')
print(obj)
#--------------------结果集的遍历---------
# iterator()的使用,结果集的处理,算法方面延伸。
for obj in models.Article.objects.all().iterator():
#---------------------复杂查询---------------
#like,包含:
obj=models.Article.objects.get(title__contains='模型')
#like,包含:不区分大小写
obj=models.Article.objects.get(title__icontains='模型')
#like,以XX开头,不区分大小写
f1=models.Article.objects.filter(title__istartswith="P")
print(f1)
#like,以XX结尾,不区分大小写
f2=models.Article.objects.filter(title__endswith="thon")
print(f2)
#查询字段为空:
f=models.Article.objects.filter(img="")
#查询字段为null:
f=models.Article.objects.filter(img__isnull=True)
#and且条件查询:
f=models.Article.objects.filter(tag__isnull=True,img="")
#or或条件查询:
(1)导入Q类:from django.db.models import Q
(2)|取并集:models.Article.objects.filter(Q(tag__isnull=True)|Q(img=""))
#in:
f=models.Article.objects.filter(id__in=[1,2])
print(f)
#not in:排除exclude:
f=models.Article.objects.exclude(id__in=[1,2])
print(f)
#count统计数量:
count=models.Article.objects.exclude(id_in=[1,2]).count()
#升序:
f=models.Article.objects.all().order_by(id)
#降序:
f=models.Article.objects.all().order_by(-id)
#获取结果集的第一条数据:
f=models.Article.objects.filter(id=10).first()
#获取结果集的最后一条数据:
f=models.Article.objects.filter(id=10).last()
#切片,获取部分数据,相当于limit
obj=models.Article.objects.all()[:5]
print(obj)
#去重:
f=models.Article.objects.filter(id="1").distinct()#无法指定按某个字段去重
f=models.Article.objects.values("title").distinct()#指定按某个字段去重
#判断是否存在,返回true、false:
f=models.Article.objects.filter(XXX="").exists()
#=============django正向查询、反向查询===========
#=========Publish为主表,Book为子表,Book中有外键(ForeignKey)键至Publish===========
#一对多查询/子表查询主表的方式---正向查询:
book = Book.objects.get(id='1')
publish=book.publish_id
print(publish.name)
#一对多查询/主表查询子表的方式---反向查询:主表.子表_set.all() 【备注:还有其他方式】
publish=Publish.objects.get(id='1')
books=publish.book_set.all()
book=publish.book_set.filter(xx='')
#=============================================
#多对多查询:
#一对一查询:
#分页查询:from django.core.paginator import Paginator
# l=range(100)
# p=Paginator(l,10) #第一个参数是要分页的数据list,每页展示的数量
# print(list(p.get_page(2))) #第二页
# print(p.page(1)) #第一页
# print(p.num_pages) #总页数
# print(p.count) #总数
# print(p.page_range) #获取分页的范围
# print(p.page_range[0])
# print(p.page_range[-1])
#
# page=p.page(1)
# print(page.has_previous()) #是否有上一页
# print(page.has_next()) #是否有下一页
# print(page.has_other_pages()) #是否还有其他页
#
# print(page.next_page_number())#下一页的页码
# print(page.previous_page_number())#上一页的页码,没有会报错
# print(page.start_index()) #取首页的页码
# print(page.end_index())#取末尾的页码
# print(page.number) #获取当前页面
# print(page.paginator) #获取对象
3. 数据库的新增:
#方式1: objects.create()
# models.Article.objects.create(
# id="Python123",
# desc="Python23描述",
# content="Python123文章内容",
# img=""
# )
#
#方式2:用save
# art=models.Article(title="",desc="",content="",category_id="")
# art.save
4. 数据库的修改:
#1. 修改一条数据
# a=models.Article.objects.get(id=1)
# a.title=""
# a.save()
#2. 修改多条数据
# 根据条件修改
# models.Article.objects.filter(show_count=0).update(show_count=500)
# # 修改所有的
# models.Article.objects.all().update(show_count=500)
5. 数据库的删除:
# 1. 单个删除
# a=models.Article.objects.get(id=1)
# a.delete()
# 2. 批量删除
# models.Article.objects.filter(show_count=0).delete()
# models.Article.objects.all().delete()