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

posted @ 2017-12-07 19:32  hello沃德  阅读(89)  评论(0)    收藏  举报