【第十四周 第 3 节】模型层(三)

第十四周-第三节课

django.setup()

import os
import random
import django


def create_reader():
    for i in range(10):
        reader = Reader(
            name=f'name_{i}',
            email=f'email_{i}@163.com',
            null_test=None,
            blank_test='',
            whether_vip=random.choice([True, False])
        )

		# 通过clean_fields方法对当前对象进行自检
        # 如果当前字段可以为None, 则需要将该字段置入exclude参数中
        reader.clean_fields(exclude=['null_test'])
        
        # 调用save会往数据插入一条数据或者更新一条数据
        reader.save()


if __name__ == "__main__":
    # 设置环境变量
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite.settings")
    django.setup()
    from myblog.models import Reader
    create_reader()

QuerySet

  • Create

    • save
  • Retrieve

    Django的orm时一条执行链, 而不是单个语句

    Reader.objects.all().filter(id__gt=300).order_by("name", "id")
    

    orm尽量使用一些简单的接口

    如果查询需求比较复杂, 尽量使用SQL

    • all

      获取表中所有记录

      如果表非常大, 一定要小心使用.

    • get

      通过指定条件, 获取一条数据, 如果有多条, 则会报错

      reader = Reader.objects.get(name="name_0")
      
    • filter

      匹配满足条件的记录, 类似于SQL中的WHERE语句

      reader_array = Reader.objects.filter(name="name_0")
      
      • 比较

        Reader.objects.filter(id__gte=300)
        
        • >= ----- gte
        • > --------gt
        • <=-------lte
        • < --------lt
      • 模糊匹配

        类似于WHERE 字段 LIKE '%xx%'

        • __startswith
        • __endswith
        • __icontains
    • exlude

      filter逻辑取反

    • 限制返回的记录数

      相当于SQL中的limit

      reader_array[:5]
      
    • latest

      # 需要在models, Meta中指定get_latest_by
      Reader.objects.latest()
      
    • order_by

      Reader.objects.all().order_by("name", "id")
      
  • Update

    • save

      reader.email = "test@163.com"
      reader.save()
      
  • Delete

    如果想对整张表进行清除, 还是truncate table命令更快

    • delete

      reader.delete()
      

高级

  • RAW

    遇到复杂的场景, 需要使用SQL语句

    通过Reader._meta.db_table来获取记录所在表

    queryset = Reader.objects.raw(f"select * from {Reader._meta.db_table} limit 1")
    list(queryset)
    
  • 指定数据库

    • 在settings配置该数据库,

      DATABASES = {
          'default': {
              'ENGINE': 'django.db.backends.mysql',
              'NAME': 'polls',
              'USER': 'root',
              'PASSWORD': 'qwe369',
              'HOST': '127.0.0.1',
              'PORT': '3306'
          },
          'person': {
              'ENGINE': 'django.db.backends.mysql',
              'NAME': 'person',
              'USER': 'root',
              'PASSWORD': 'qwe369',
              'HOST': '127.0.0.1',
              'PORT': '3306'
          }
      }
      
    • 使用参数using

      reader.save(using='person')
      
      Reader.objects.using('person').all()
      
  • 事务

    • 基于HTTP请求的事务

      • settings中要设置ATOMIC_REQUESTSTrue
      from django.db import transaction
      
      @transaction.atomic
      def my_view(request):
      	表达式...
      
    • 基于视图具体逻辑的事务

      from django.db import transaction
      
      def viewfunc(request):
      	表达式
      	with transaction.atomic():
      		表达式A
      		表达式B
      		...
      
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值