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()
"""
13条返回值

 

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)
外键操作

 

posted @ 2020-03-12 22:13  无夜。  阅读(167)  评论(0)    收藏  举报