ORM操作
目录
1. ORM字段和参数
字段:
AutoField 主键 IntegerField 整数 CharField 字符串 BooleanField 布尔值 TextField 文本 DateTimeField DateField 日期时间 auto_now_add=True # 新增数据的时候会自动保存当前的时间 auto_now=True # 新增、修改数据的时候会自动保存当前的时间 DecimalField 十进制的小数 max_digits 小数总长度 5 decimal_places 小数位长度 2
参数:
null 数据库中字段是否可以为空 blank=True form表单填写时可以为空 default 字段的默认值 db_index 创建索引 unique 唯一 choices=((0, '女'), (1, '男')) 可填写的内容和提示(0是数据库存储的值,女是前端展示的值)
示例:
class Person(models.Model): pid = models.AutoField(primary_key=True) name = models.CharField('姓名', max_length=32, db_column='username', unique=True, help_text='不要写乳名') # name varchar(32) age = models.IntegerField(default=18, verbose_name='年纪', editable=False) birth = models.DateTimeField(auto_now=True) phone = MyCharField(max_length=11, blank=True, null=True) # 数据库可以为null gender = models.BooleanField('性别', choices=((0, '女'), (1, '男')))
2. 表的参数
class Meta: db_table = "person" # 表名 verbose_name = '个人信息' verbose_name_plural = '个人信息' index_together = [ ("name", "age"), # 应为两个存在的字段 ] unique_together = (("name", "age"),) # 应为两个存在的字段
示例:
class Person(models.Model): pid = models.AutoField(primary_key=True) name = models.CharField('姓名', max_length=32, db_column='username', unique=True, help_text='不要写乳名') # name varchar(32) age = models.IntegerField(default=18, verbose_name='年纪', editable=False) birth = models.DateTimeField(auto_now=True) phone = MyCharField(max_length=11, blank=True, null=True) # 数据库可以为null gender = models.BooleanField('性别', choices=((0, '女'), (1, '男'))) def __str__(self): return '{} - {}'.format(self.pk, self.name) class Meta: db_table = "person" # 表名 # 排序 # ordering = ('age','-pk') verbose_name = '个人信息' verbose_name_plural = '个人信息' index_together = [ ("name", "age"), # 应为两个存在的字段 ] # unique_together = (("name", "age"),) # 应为两个存在的字段
3. ORM查询(13条)
import os os.environ.setdefault("DJANGO_SETTINGS_MODULE", "orm_practice.settings") import django django.setup() # 从这里开始,上面是引入django环境 from app01 import models # 1. all() 获取所有的数据 ——》 QuerySet 对象列表 ret = models.Person.objects.all() # 2. get() 获取满足条件的一个数据 ——》 对象 # 获取不到或者多个都报错 ret = models.Person.objects.get(pk=1) # 3. filter() 获取满足条件的所有数据 ——》 QuerySet 对象列表 ret = models.Person.objects.filter(pk=1) # 4. exclude() 获取不满足条件的所有数据 ——》 QuerySet 对象列表 ret = models.Person.objects.exclude(pk=1) # 5. values() 拿到对象所有的字段和字段的值 QuerySet [ {} ,{} ] # values('字段') 拿到对象指定的字段和字段的值 QuerySet [ {} ,{} ] ret = models.Person.objects.values('pid','name') # 6. values_list() 拿到对象所有的字段的值 QuerySet [ () ,() ] # values('字段') 拿到对象指定的字段的值 QuerySet [ {} ,{} ] ret = models.Person.objects.values_list('name','pid') # 7. order_by 排序 - 降序 ——》 QuerySet [ () ,() ] ret = models.Person.objects.all().order_by('age','-pid') # 8. reverse 反向排序 只能对已经排序的QuerySet进行反转 ret = models.Person.objects.all() ret = models.Person.objects.all().reverse() # 9. distinct 去重 完全相同的内容才能去重 ret = models.Person.objects.values('age').distinct() # 10. count() 计数 ret = models.Person.objects.all().count() # 11. first 取第一元素 没有元素 None ret = models.Person.objects.filter(pk=1).values().first() # 12. last 取最后一元素 没有元素 None # 13. exists 查询的数据是否存在 ret = models.Person.objects.filter(pk=1000).exists() print(ret)
返回值分类:
""" 返回queryset all() filter() exclude() values() values_list() order_by() reverse() distinct() 返回对象 get() first() last() 返回数字 count() 返回布尔值的 exists() """
4. 单表的双下划线
import os os.environ.setdefault("DJANGO_SETTINGS_MODULE", "orm_practice.settings") import django django.setup() from app01 import models ret = models.Person.objects.filter(pk__gt=1) # gt greater than 大于 ret = models.Person.objects.filter(pk__lt=3) # lt less than 小于 ret = models.Person.objects.filter(pk__gte=1) # gte greater than equal 大于等于 ret = models.Person.objects.filter(pk__lte=3) # lte less than equal 小于等于 ret = models.Person.objects.filter(pk__range=[2,3]) # range 范围 ret = models.Person.objects.filter(pk__in=[1,3,10,100]) # in 成员判断 ret = models.Person.objects.filter(name__contains='A') ret = models.Person.objects.filter(name__icontains='A') # 忽略大小写 ret = models.Person.objects.filter(name__startswith='a') # 以什么开头 ret = models.Person.objects.filter(name__istartswith='A') ret = models.Person.objects.filter(name__endswith='a') # 以什么结尾 ret = models.Person.objects.filter(name__iendswith='I') ret = models.Person.objects.filter(birth__year='2019') ret = models.Person.objects.filter(birth__contains='2018-06-24') ret = models.Person.objects.filter(phone__isnull=False) print(ret)
5. 外键的操作
import os os.environ.setdefault("DJANGO_SETTINGS_MODULE", "orm_practice.settings") import django django.setup() from app01 import models # 基于对象的查询 # 正向 book_obj = models.Book.objects.get(title='菊花怪大战MJJ') # print(book_obj.pub) # 反向 pub_obj = models.Publisher.objects.get(pk=1) # print(pub_obj.book_set.all()) # 类名小写_set 没有指定related_name # print(pub_obj.books.all()) # 指定related_name='books' # 基于字段的查询 ret = models.Book.objects.filter(title='菊花怪大战MJJ') # 查询老男孩出版的书 ret = models.Book.objects.filter(pub__name='老男孩出版社') # 查询出版菊花怪大战MJJ的出版社 # related_name='books' # ret= models.Publisher.objects.filter(books__title='菊花怪大战MJJ') # 没有指定related_name 类名的小写 # ret= models.Publisher.objects.filter(book__title='菊花怪大战MJJ') # related_query_name='xxx' ret= models.Publisher.objects.filter(xxx__title='菊花怪大战MJJ') print(ret)

浙公网安备 33010602011771号