django的ORM常用字段和参数

Python之django(ORM常用字段和参数)

文章目录

一、测试环境的搭建

当我们新建一个应用时,这个应用通常会自带一个test.py的文件这个文件就是测试文件。我们学要把测试所需的环境搭建起来,然后在文件书写要测试的代码右键直接run test.py就可以了,不需要再把django项目启动起来

此时控制台会输出代码运行的结果(熟悉的感觉又回来了)

测试环境的搭建如下代码

from django.test import TestCase

# Create your tests here.
import os
import sys

if __name__ == "__main__":
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "Mysite03.settings")
    import django
    django.setup()
    print('就一个字,帅!')  # 就一个字,帅!

例如:想测试往数据库里添加数据是否成功

from django.test import TestCase

# Create your tests here.
import os
import sys

if __name__ == "__main__":
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "Mysite03.settings")
    import django
    django.setup()
    from app01 import models

    reg_obj = models.student.objects.create(
        student_name='小张',
        student_account='xiaozhang',
        student_pwd='123456',
        student_age='22',
        student_hobby='1'
    )


    see_obj = models.student.objects.filter(student_account='xiaozhang').first()
    print(see_obj)
# 就一个字,帅!
# 小张

二、单表操作之必知必会十三条

queryset是查询集,就是传到服务器上的url里面的内容。Django会对查询返回的结果集QuerySet进行缓存,这里是为了提高查询效率。也就是说,在你创建一个QuerySet对象的时候,Django并不会立即向数据库发出查询命令,只有在你需要用到这个QuerySet的时候才回去数据库查询。

1、all():查询所有结果
print(models.student.objects.all())
返回的是所有queryset对象
# <QuerySet [<student: jason>, <student: egon>, <student: ly>, <student: 小张>]>
2、filter(**kwargs): 它包含了与所给筛选条件相匹配的对象
print(models.student.objects.filter(student_name='小张'))
# <QuerySet [<student: 小张>]>
3、get(**kwargs): 返回与所给筛选条件相匹配的对象,返回结果有且只有一个,如果符合筛选条件的对象超过一个或者没有都会抛出错误
get_something = models.student.objects.get(id=3)
print(get_something,get_something.student_age)
# egon 19


get_something = models.student.objects.get(id=100)
print(get_something,get_something.student_age)
# app01.models.DoesNotExist: student matching query does not exist.
4、exclude(**kwargs): 它包含了与所给筛选条件不匹配的对象
print(models.student.objects.exclude(student_is_delete=True))
# <QuerySet [<student: jason>, <student: ly>, <student: 小张>]>
5、values(*field): 返回一个ValueQuerySet——一个特殊的QuerySet,运行后得到的并不是一系列model的实例化对象,而是一个可迭代的字典序列
print(models.student.objects.values('student_is_delete'))
# <QuerySet [{'student_is_delete': False}, {'student_is_delete': True}, {'student_is_delete': False}, {'student_is_delete': False}]>
6、values_list(*field): 它与values()非常相似,它返回的是一个元组序列,values返回的是一个字典序列
print(models.student.objects.values_list('student_is_delete'))
# <QuerySet [(False,), (True,), (False,), (False,)]>
7、order_by(*field): 对查询结果排序
print(models.student.objects.order_by('student_age')) # 默认按升序排列
# <QuerySet [<student: jason>, <student: egon>, <student: ly>, <student: 小张>]>
8、reverse(): 对查询结果反向排序,请注意reverse()通常只能在具有已定义顺序的QuerySet上调用(在model类的Meta中指定ordering或调用order_by()方法)。
print(models.student.objects.order_by('student_age').reverse())
# <QuerySet [<student: ly>, <student: 小张>, <student: egon>, <student: jason>]>
9、distinct(): 从返回结果中剔除重复纪录(如果你查询跨越多个表,可能在计算QuerySet时得到重复的结果。此时可以使用distinct(),(注意只有在PostgreSQL中支持按字段去重。)
10、count(): 返回数据库中匹配查询(QuerySet)的对象数量。
print(models.student.objects.all().count())
# 4
11、first(): 返回第一条记录
print(models.student.objects.order_by('student_age').reverse().first())
# ly
12、last(): 返回最后一条记录
print(models.student.objects.order_by('student_age').reverse().last())
# jason
13、exists(): 如果QuerySet包含数据,就返回True,否则返回False
print(models.student.objects.filter(student_name='小张').exists())
# True

三、单表查询之神奇的下划线

models.Tb1.objects.filter(id__lt=10, id__gt=1)   # 获取id大于1 且 小于10的值
 
models.Tb1.objects.filter(id__in=[11, 22, 33])   # 获取id等于11、22、33的数据
models.Tb1.objects.exclude(id__in=[11, 22, 33])  # not in
 
models.Tb1.objects.filter(name__contains="ven")  # 获取name字段包含"ven"的
models.Tb1.objects.filter(name__icontains="ven") # icontains大小写不敏感
 
models.Tb1.objects.filter(id__range=[1, 3])      # id范围是1到3的,等价于SQL的bettwen and
 
类似的还有:startswith,istartswith, endswith, iendswith 

date字段还可以:
models.Class.objects.filter(first_day__year=2017)
date字段可以通过在其后加__year,__month,__day等来获取date的特点部分数据
# date
        #
        # Entry.objects.filter(pub_date__date=datetime.date(2005, 1, 1))
        # Entry.objects.filter(pub_date__date__gt=datetime.date(2005, 1, 1))

        # year
        #
        # Entry.objects.filter(pub_date__year=2005)
        # Entry.objects.filter(pub_date__year__gte=2005)

        # month
        #
        # Entry.objects.filter(pub_date__month=12)
        # Entry.objects.filter(pub_date__month__gte=6)

        # day
        #
        # Entry.objects.filter(pub_date__day=3)
        # Entry.objects.filter(pub_date__day__gte=3)

        # week_day
        #
        # Entry.objects.filter(pub_date__week_day=2)
        # Entry.objects.filter(pub_date__week_day__gte=2)
需要注意的是在表示一年的时间的时候,我们通常用52周来表示,因为天数是不确定的,老外就是按周来计算薪资的哦~

四、外键的增删改查

models.py

"""
需要明确的关系:
    出版者对书的关系为一对多(一个出版社可以出版多本书)
    书和作者的关系为多对多的关系(多个作者可以出版一本书,一本书也可以有多个作者)
    作者和作者详情是一对一关系(一个作者只能由一个作者详情)
"""

# 创建书这张表
class Book(models.Model):
    title = models.CharField(max_length=32,verbose_name='书名')
    price = models.DecimalField(max_digits=8,decimal_places=2,verbose_name='书价格')

    # 出版社对书
    publish = models.ForeignKey(to='Publish')

    # 书对作者
    author = models.ManyToManyField(to='Authors')



# 创建出版社表
class Publish(models.Model):
    name = models.CharField(max_length=32,verbose_name='出版社名'
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值