ORM单表和多表操作 双下划线查询
第一步:创建表
class Student(models.Model):
nid=models.AutoField(primary_key=True) # 主键约束
name=models.CharField(max_length=32) # 字符串字段
birth=models.DateField() # 日期类型
class_id=models.IntegerField(default=0)
单表操作:
查询记录API:
(1)Student.objects.all() #返回的QuerySet类型 查询所有记录 [obj1,obj2....]
(2)Student.objects.filter() #返回的QuerySet类型 查询所有符合条件的记录
(3)Student.objects.exclude()#返回的QuerySet类型 查询所有不符合条件的记录
(4)Student.objects.get() #返回的models对象 查询结果必须有且只有一个,否则报错
(5)Student.objects.all().first() #返回的models对象 查询结果集合中的第一个
(6)Student.objects.filter().last() #返回的models对象 查询结果集合中的最后一个
(7)Student.objects.all().values("name","class_id") #返回的QuerySet类型 ,列表中存放的字典
(8)Student.objects.all().values_list("name","class_id") #返回的QuerySet类型 ,列表中存放的元组
(9)Student.objects.all().order_by("class_id") # 按指定字段排序,不指定,按主键排序
(10)Student.objects.all().count() # 返回的记录个数
(11)Student.objects.all().values("name").distinct() (去重)
(12)Student.objects.all().exist()
单表查询之双下划线 __
Student.objects.filter()
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")
models.Tb1.objects.filter(name__icontains="ven") # icontains大小写不敏感
models.Tb1.objects.filter(id__range=[1, 2]) # 范围bettwen and
startswith,istartswith, endswith, iendswith
添加记录:
方式1:
s=Student(name='',birth='',class_id='')
s.save()
方式2:
stu_obj=Student.objects.create(name='',birth='',class_id='') # stu_obj是添加的记录对象
删除记录:
Student.objects.filter(nid=1).delete() # QuerySet类型调用
修改记录:
Student.objects.filter(nid=1).update(name="yuan")
注意:一定区分object与querySet的区别 !!!
http://www.cnblogs.com/yuanchenqi/articles/7552333.html#_label2 参考博客————1
取name的值:querySet[0].name
取id的值:querySet[0].id
多表操作:
创建表:
class Book(models.Model):
title = models.CharField(max_length=32)
publishDate = models.DateField()
price = models.DecimalField(max_digits=5, decimal_places=2) # 999.99
# 创建一对多的关联字段 : 是与某个书籍对象关联的出版社对象(注意,只有一个对象)
publish=models.ForeignKey("Publish")
# 创建的多对多的关系
authors=models.ManyToManyField("Author")
class Publish(models.Model):
nid = models.AutoField(primary_key=True)
name=models.CharField( max_length=32)
email=models.EmailField()
class Author(models.Model):
name=models.CharField(max_length=32)
age=models.IntegerField()
class AuthorDetail(models.Model):
addr=models.CharField(max_length=32)
email=models.EmailField()
author=models.OneToOneField("Author")
基于对象的跨表查询:
一对多:
book_obj.publish
Book--------------------------->Publish
publish_obj.book_set.all() (queryset集合)
Book<---------------------------Publish
例题:
查询python这本书的出版社的名字 (正向查询,按字段)
Book.objects.get(title="python").publish.name
查询沙河出版社出版过的书籍名称 (反向查询按:表名_set)
Publish.objects.get(name="沙河出版社").book_set.all() #因为可能有多本所以用all()
多对多:
book_obj.authors.all()
Book--------------------------->Author
author_obj.book_set.all()
Book<---------------------------Author
例题:
查询python这本书的所有作者的名字 (正向查询,按字段)
Book.objects.get(title="python).authors.all()
查询alex出版过的所有书籍 (反向查询按:表名_set)
Author.objects.get(name="alex").book_set.all()
一对一:
authordetail_obj.author
AuthorDetail--------------------------->Author
author_obj.authordetail
AuthorDetail<---------------------------Author
查询的地址在烟台并且email是789的作者的名字 (正向查询,按字段)
AuthorDetail.objects.get(addr="烟台" , email ="789").author.name
查询文州的email (反向查询按:表名)
Author.objects.get(name="文州").authordetail.email ( 凡是涉及到按照表名的都要把表名小写 )
基于双下划线查询:(join查询)
============基于双下划线的查询:正向查询,按字段;反向查询,按表名============
Django 还提供了一种直观而高效的方式在查询(lookups)中表示关联关系,它能自动确认 SQL JOIN 联系。要做跨关系查询,就使用两个下划线来链接模型(model)间关联字段的名称,直到最终链接到你想要的 model 为止。
查询人民出版社出版过的书籍名称
Publish.objects.filter(name="人民出版社").values("book__title")
email以456开头的作者出版过的所有书籍名称以及出版社名称
Book.objects.filter(authors__authordetail__email__startswith="456").value
参考博客:http://www.cnblogs.com/yuanchenqi/articles/7552333.html#_label3

浙公网安备 33010602011771号