侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

Django的models模型的具体使用

框架(架构)  /  管理员 发布于 7年前   242

model的常用字段

V=models.CharField(max_length=None[, **options])    #varcharV=models.EmailField([max_length=75, **options])    #varcharV=models.URLField([verify_exists=True, max_length=200, **options])    #varcharV=models.FileField(upload_to=None[, max_length=100, **options])    #varchar#upload_to指定保存目录可带格式,V=models.ImageField(upload_to=None[, height_field=None, width_field=None, max_length=100, **options])V=models.IPAddressField([**options])    #varcharV=models.FilePathField(path=None[, match=None, recursive=False, max_length=100, **options]) #varcharV=models.SlugField([max_length=50, **options])    #varchar,标签,内含索引V=models.CommaSeparatedIntegerField(max_length=None[, **options])    #varcharV=models.IntegerField([**options])    #intV=models.PositiveIntegerField([**options])    #int 正整数V=models.SmallIntegerField([**options])    #smallintV=models.PositiveSmallIntegerField([**options])    #smallint 正整数V=models.AutoField(**options)    #int;在Django代码内是自增V=models.DecimalField(max_digits=None, decimal_places=None[, **options])    #decimalV=models.FloatField([**options])    #realV=models.BooleanField(**options)    #boolean或bitV=models.NullBooleanField([**options])    #bit字段上可以设置上null值V=models.DateField([auto_now=False, auto_now_add=False, **options])    #date#auto_now最后修改记录的日期;auto_now_add添加记录的日期V=models.DateTimeField([auto_now=False, auto_now_add=False, **options])    #datetimeV=models.TimeField([auto_now=False, auto_now_add=False, **options])    #timeV=models.TextField([**options])    #textV=models.XMLField(schema_path=None[, **options])    #text――――――――――――――――――――――――――CV=models.ForeignKey(othermodel[, **options])    #外键,关联其它模型,创建关联索引V=models.ManyToManyField(othermodel[, **options])    #多对多,关联其它模型,创建关联表V=models.OneToOneField(othermodel[, parent_link=False, **options])    #一对一,字段关联表属性

经典情景示例

书籍,作者,出版社之间的关系,这里为了便于演示,我们尽量精简了表中的字段,书籍表具有书名,出版社同出版社表建立一对多的关系[foreign key],一本书可以具有多个作者,又同作者表建立多对多的关系[many-to-many],作者表有名称,年龄,出版社表有出版社名称。

from django.db import modelsclass Publisher(models.Model):  name = models.CharField(max_length=30)   def __str__(self):    return self.name class Author(models.Model):  name = models.CharField(max_length=30)  age = models.IntegerField()   def __str__(self):    return self.name class Book(models.Model):  title = models.CharField(max_length=100)  authors = models.ManyToManyField(Author)  publisher = models.ForeignKey(Publisher,on_delete=models.CASCADE)   def __str__(self):    return self.title

选择对象

获取全体对象

Publisher.objects.all() #获取所有对象

筛选对象

Publisher.objects.filter(name='人们教育出版社') #获取的是一个对象列表dict = {'name':'lemon','age':18}Author.objects.filter(**dict) #列表传参的方法

获取单个对象

Publisher.objects.get(name='机械工业出版社') #找不到会报错!!!

对象排序

Author.objects.order_by("name","-age") #可以按照多个字段排序,- 表示逆向排序

连查

Author.objects.filter(name='lemon').order_by('-age')[0]

批量更新

Author.objects.all().update(age='18')

删除对象

Author.objects.filter(name='lemon').delete()

外键和多对多操作

访问外键

Book.objects.get(id=1).publisher #得到书籍的出版社

反向查询

models.Publisher.objects.get(id=1).book_set.all() #反向查询,得到的是一个queryset对象列表

多对多操作

Book.objects.get(id=1).authors.all() #得到queryset对象列表

自定义models方法

class Author(models.Model):  name = models.CharField(max_length=30)  age = models.IntegerField()  def __str__(self):    return self.name  def status(self):    if self.name=='lemon':      return '帅哥'

运行结果:

aa = models.Author.objects.get(id=1)
print(aa.status())
―――――――――――――――运行结果――――――――――――――――――
帅哥

自定义manager管理器

class AuthorManager(models.Manager):  def name_count(self,str_name):    return self.filter(name__icontains=str_name).count()class Author(models.Model):  name = models.CharField(max_length=30)  age = models.IntegerField()  def __str__(self):    return self.name  def status(self):    if self.name=='lemon':      return '帅哥'  #一旦定义了新的管理器,默认管理器需要显示声明出来才可以使用  objects = models.Manger() #默认管理器  object=AuthorManager() #新定义管理器

执行结果:

aa = models.Author.object.name_count('lemon')
print(aa) #――――――》2

自定义sql语句

class AuthorManager(models.Manager):  def age_stat(self, age_int):    cursor = connection.cursor()    cursor.execute("""      SELECT NAME      FROM app2_author      WHERE age = %s""", [age_int])    #fetchall()返回的是元组的列表    return [row[0] for row in cursor.fetchall()]    class Author(models.Model):  name = models.CharField(max_length=30)  age = models.IntegerField()  # objects =models.Manager()  object=AuthorManager()  def __str__(self):    return self.name

执行结果:

aa = models.Author.object.age_stat(18)
print(aa)
-----------------
['lemon', 'Luouo']

过滤字段发方法

__exact 精确等于 like 'aaa'
 __iexact 精确等于 忽略大小写 ilike 'aaa'
 __contains 包含 like '%aaa%'
 __icontains 包含 忽略大小写 ilike '%aaa%',但是对于sqlite来说,contains的作用效果等同于icontains。
__gt 大于
__gte 大于等于
__lt 小于
__lte 小于等于
__in 存在于一个list范围内
__startswith 以...开头
__istartswith 以...开头 忽略大小写
__endswith 以...结尾
__iendswith 以...结尾,忽略大小写
__range 在...范围内
__year 日期字段的年份
__month 日期字段的月份
__day 日期字段的日
__isnull=True/False

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


  • 上一条:
    Django中celery执行任务结果的保存方法
    下一条:
    Django的models中on_delete参数详解
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • Filament v3.1版本发布(0个评论)
    • docker + gitea搭建一个git服务器流程步骤(0个评论)
    • websocket的三种架构方式使用优缺点浅析(0个评论)
    • ubuntu20.4系统中宿主机安装nginx服务,docker容器中安装php8.2实现运行laravel10框架网站(0个评论)
    • phpstudy_pro(小皮面板)中安装最新php8.2.9版本流程步骤(0个评论)
    • 近期文章
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • 在go + gin中gorm实现指定搜索/区间搜索分页列表功能接口实例(0个评论)
    • 在go语言中实现IP/CIDR的ip和netmask互转及IP段形式互转及ip是否存在IP/CIDR(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2018-05
    • 2020-02
    • 2020-03
    • 2020-05
    • 2020-06
    • 2020-07
    • 2020-08
    • 2020-11
    • 2021-03
    • 2021-09
    • 2021-10
    • 2021-11
    • 2022-01
    • 2022-02
    • 2022-03
    • 2022-08
    • 2023-08
    • 2023-10
    • 2023-12
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客