利用Django对数据库数据进行查询
利用 Django 对数据库数据进行查询 from django.db import models class Blog(models.Model): name = models.CharField(max_length=100) tagline = models.TextField() def __str__(self):# __unicode__ on Python 2 return self.name class Author(models.Model): name = models.CharField(max_length=200) email = models.EmailField() def __str__(self):# __unicode__ on Python 2 return self.name class Entry(models.Model): blog = models.ForeignKey(Blog, on_delete=models.CASCADE) headline = models.CharField(max_length=255) body_text = models.TextField() pub_date = models.DateField() mod_date = models.DateField() authors = models.ManyToManyField(Author) n_comments = models.IntegerField() n_pingbacks = models.IntegerField() rating = models.IntegerField() def __str__(self):# __unicode__ on Python 2 return self.headline 保存对象 要更改已存在于数据库的对象然后进行保存,使用save()。 例如: b5.name = ‘New Name’ b5.save() 存储 ForeignKey和 ManyToManyField 更新 ForeignKey字段和更新普通字段的方法相同: from blog.models import Blog, Entry entry = Entry.objects.get(pk=1) cheese_blog = Blog.objects.get(name=“Cheddar Talk“) entry.blog = cheese_blog entry.save() 更新 ManyToManyField,可以使用 add()字段: From blog.models improt Author Joe = Author.objects.create(name=”Joe”) entry.authors.add(Joe) 当需要一次添加多个记录时,在add()中将需要添加的字段都加上: john = Author.objects.create(name=”John”) paul = Author.objects.create(name=”Paul”) george = Author.objects.create(name=”George”) ringo = Author.objects.create(name=”Ringo”) Entry.authors.add(john, paul, george, ringo) 检索对象 检索所有对象 从数据库表中检索对象的最简单方法是获取所有对象: All_entries = Entry.objects.all() 使用过滤器检索特定的对象 在 QuerySet 中用 all()返回数据库的表中的所有对象。但是通常情况下,我们只需 要完整对象集中的一部分。 在这种情况下可以使用下面方法,添加过滤条件: Filter(**kwargs)返回一个新的 QuerySet 包含给定查找参数的对象/ Exclude(**kwargs)返回除给定查找参数之外的对象。 例如,需要获得 QuerySet2006 年的博客条目,使用 filter()如下所示: Entry.objects.filter(pub_date__year=2006) 相当于: Entry.objects.all().filter(pub_date__year=2006) 组合过滤 例如: Entry.objects.filter( .headline__startswith= What . ).exclude( .pub_date__gte=datetime.date.today() . ).filter( .pub_date__gte=datetime.date(2005, 1, 30) . ) 表示为以 2005 年 1 月 30 日和当天发布的“What”开头的数据。 已筛选的 QuerySets 是唯一的 每当你重新定义一个 QuerySet,你就会得到一个新的 QuerySet,这个 QuerySet 和 你现在的定义绑定。他可以重复使用或重新定义。 例如: q1 = Entry.objects.filter(headline__startswith=“What“) q2 = q1.exclude(pub_date__gte=datetime.date.today()) q3 = q1.filter(pub_date__gte=datetime.date.today()) Q1 为以 What 开头的数据,q2 继承 q1 在 q1 基础上排除时间为今天的数据,q3 继 承 q1 在 q1 基础上过滤为时间是今天的。 查询表达式 查询表达式描述可用作更新、 创建、 过滤、 排序、 注释或聚合的一部分的值或计算。 有很多的内置表达式可以用于查询。 表达式可以组合,或在某些情况下进行嵌套, 用于 更复杂的计算。 支持的算术 Django 支持使用 Python 常量,变量,甚至其他的表达式对查询表达式进行 加法,减法,乘法,除法,模运算和运算符运算。 例子: from django.db.models import F, Count, Value from django.db.models.functions import Length, Upper # Find companies that have more employees than chairs. Company.objects.filter(num_employees__gt=F( num_chairs )) # Find companies that have at least twice as many employees # as chairs. Both the querysets below are equivalent. Company.objects.filter(num_employees__gt=F( num_chairs ) * 2) Company.objects.filter( num_employees__gt=F( num_chairs ) +