Django之ORM操作

以下信息可能有些并不完整或者有些错误的理解,我会在以后的学习过程中进行修改

Queryset数据类型
QuerySet与惰性机制
所谓惰性机制:Publisher.objects.all()或者.filter()等都只是返回了一个QuerySet(查询结果集对象),它并不会马上执行sql,而是当调用QuerySet的时候才执行。

QuerySet特点:
    <1>  可迭代 
    <2>  可切片
    <3>  惰性计算和缓存机制

model.py创建表单

from django.db import models
class Book(models.Model):
    title = models.CharField(max_length=6,verbose_name="书名") 
    author = models.ManyToManyField('Author')
    publish = models.ForeignKey('Publish', on_delete=models.CASCADE)
    price = models.IntegerField()
class Publish(models.Model):
	name = models.CharField(max_length = 30)
    address = models.CharField(max_length = 50)
class Author(models.Model):
    name = models.CharField(max_length = 30)
    sex = models.BooleanField(max_length=1, choices=((0, '男'),(1, '女'),))
    email = models.EmailField()
    address = models.CharField(max_length=50)
    birthday = models.DateField()

ORM常用的QuerySet接口
增加

单表添加:
1、
	表名.objects.create(**kwargs)
	Book.objects.create(title="Django 企业开发实战"...)
2、
	book = 表名(**kwargs)
	book.save()
3、
	author = 表名()
	author.name = ''
	author.save()
一对多添加:
1、
    publish_obj = Publish.objects.get(name="人民邮电出版社")
    author_obj = Author.objects.get(name="the5file")
    Book.objects.create(title="Django 企业开发实战",author=author_obj,publish=publish_obj)
2、
	book = Book(title="Django 企业开发实战",author=author_obj,publish=publish_obj)
	book.save()
多对多添加:
1、
	book = Book.objects.get(title="Django 企业开发实战")
    author_obj = Author.objects.get(name="the5file")
    book.author.add(author_obj) # 要添加多个只需写多个参数就可以了
    add(*objs,bulk = True,through_defaults = None)
2、
	book.author = author_obj
	book.save()
3、
	b = Blog.objects.get(id=1)
	e = b.entry_set.create(
    	headline='Hello',
    	body_text='Hi',
    	pub_date=datetime.date(2005, 1, 1)
 	)
4、
	b = Blog.objects.get(id=1)
 	e = Entry(
    	blog=b,
    	headline='Hello',
    	body_text='Hi',
    	pub_date=datetime.date(2005, 1, 1)
    )
	e.save(force_insert=True)
	---------------------
	

查询

1、表名.objects.filter(**kwargs)  # 包含与所给筛选条件相匹配的对象,可迭代,可切片
   Author.objects.fileter(id=1)
2、表名.objects.all()   # 查询所有结果,可迭代,可切片
   Author.objects.all
3、表名.objects.get(**kwargs)  # 返回与所筛选元素相匹配的对象,返回结果有且只有一个,如果对象不存在或超过一个,则会报错,不建议使用
   Author.objects.get(id=1)
4、表名.objects.values(*field) # 返回一个可迭代的字典序列
   Author.objects.vlaues('id', 'name', 'address')
5、表名.objects.exclude(**kwargs)  # 包含了与所给筛选条件不匹配的对象与filter相反的逻辑
6、基于Queryset的查询
    order_by(*field) # 对查询结果排序  加一个-表示降序,不加时升序,随机排列则为'?',即order_by('?'),多次使用order_by,后一个会覆盖前一个,没有参数表示清除所有的排序
    reverse()  # 对查询结果反向排序
    distinct()  # 从返回结果中剔除重复的记录
    values()  # 返回某个字段的值,结果是包含dict的QuerySet
    演示:book = Book.objects.filter(id=5).values('title')
    还可以用关键字参数,将参数传递给annotate(),给queryset添加属性。
    -------------------------
    from django.db.models.functions import Lower
 	Blog.objects.values(lower_name=Lower('name'))
	<QuerySet [{
   'lower_name': 'beatles blog'}]>
	----------------------------------------
	另外一种用法,与聚合语句一起使用
	-----------------------------------------
	class Blog(models.Model):
	    name = models.CharField(max_length=100)
	    tagline = models.TextField()
	    def __str__(self
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值