django模型models-ORM

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()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
系统根据B/S,即所谓的电脑浏览器/网络服务器方式,运用Java技术性,挑选MySQL作为后台系统。系统主要包含对客服聊天管理、字典表管理、公告信息管理、金融工具管理、金融工具收藏管理、金融工具银行卡管理、借款管理、理财产品管理、理财产品收藏管理、理财产品银行卡管理、理财银行卡信息管理、银行卡管理、存款管理、银行卡记录管理、取款管理、转账管理、用户管理、员工管理等功能模块。 文中重点介绍了银行管理的专业技术发展背景和发展状况,随后遵照软件传统式研发流程,最先挑选适用思维和语言软件开发平台,依据需求分析报告模块和设计数据库结构,再根据系统功能模块的设计制作系统功能模块图、流程表和E-R图。随后设计架构以及编写代码,并实现系统能模块。最终基本完成系统检测和功能测试。结果显示,该系统能够实现所需要的作用,工作状态没有明显缺陷。 系统登录功能是程序必不可少的功能,在登录页面必填的数据有两项,一项就是账号,另一项数据就是密码,当管理员正确填写并提交这二者数据之后,管理员就可以进入系统后台功能操作区。进入银行卡列表,管理员可以进行查看列表、模糊搜索以及相关维护等操作。用户进入系统可以查看公告和模糊搜索公告信息、也可以进行公告维护操作。理财产品管理页面,管理员可以进行查看列表、模糊搜索以及相关维护等操作。产品类型管理页面,此页面提供给管理员的功能有:新增产品类型,修改产品类型,删除产品类型。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值