model的常用字段
V=models.CharField(max_length=None[, **options]) #varchar V=models.EmailField([max_length=75, **options]) #varchar V=models.URLField([verify_exists=True, max_length=200, **options]) #varchar V=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]) #varchar V=models.FilePathField(path=None[, match=None, recursive=False, max_length=100, **options]) #varchar V=models.SlugField([max_length=50, **options]) #varchar,标签,内含索引 V=models.CommaSeparatedIntegerField(max_length=None[, **options]) #varchar V=models.IntegerField([**options]) #int V=models.PositiveIntegerField([**options]) #int 正整数 V=models.SmallIntegerField([**options]) #smallint V=models.PositiveSmallIntegerField([**options]) #smallint 正整数 V=models.AutoField(**options) #int;在Django代码内是自增 V=models.DecimalField(max_digits=None, decimal_places=None[, **options]) #decimal V=models.FloatField([**options]) #real V=models.BooleanField(**options) #boolean或bit V=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]) #datetime V=models.TimeField([auto_now=False, auto_now_add=False, **options]) #time V=models.TextField([**options]) #text V=models.XMLField(schema_path=None[, **options]) #text ——————————————————————————– V=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 models class 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
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
稳了!魔兽国服回归的3条重磅消息!官宣时间再确认!
昨天有一位朋友在大神群里分享,自己亚服账号被封号之后居然弹出了国服的封号信息对话框。
这里面让他访问的是一个国服的战网网址,com.cn和后面的zh都非常明白地表明这就是国服战网。
而他在复制这个网址并且进行登录之后,确实是网易的网址,也就是我们熟悉的停服之后国服发布的暴雪游戏产品运营到期开放退款的说明。这是一件比较奇怪的事情,因为以前都没有出现这样的情况,现在突然提示跳转到国服战网的网址,是不是说明了简体中文客户端已经开始进行更新了呢?
更新日志
- 凤飞飞《我们的主题曲》飞跃制作[正版原抓WAV+CUE]
- 刘嘉亮《亮情歌2》[WAV+CUE][1G]
- 红馆40·谭咏麟《歌者恋歌浓情30年演唱会》3CD[低速原抓WAV+CUE][1.8G]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[320K/MP3][193.25MB]
- 【轻音乐】曼托凡尼乐团《精选辑》2CD.1998[FLAC+CUE整轨]
- 邝美云《心中有爱》1989年香港DMIJP版1MTO东芝首版[WAV+CUE]
- 群星《情叹-发烧女声DSD》天籁女声发烧碟[WAV+CUE]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[FLAC/分轨][748.03MB]
- 理想混蛋《Origin Sessions》[320K/MP3][37.47MB]
- 公馆青少年《我其实一点都不酷》[320K/MP3][78.78MB]
- 群星《情叹-发烧男声DSD》最值得珍藏的完美男声[WAV+CUE]
- 群星《国韵飘香·贵妃醉酒HQCD黑胶王》2CD[WAV]
- 卫兰《DAUGHTER》【低速原抓WAV+CUE】
- 公馆青少年《我其实一点都不酷》[FLAC/分轨][398.22MB]
- ZWEI《迟暮的花 (Explicit)》[320K/MP3][57.16MB]