首页 > 代码库 > Django数据操作

Django数据操作

1.一个模型类代表数据库中的一个表,一个模型类的实例代表这个数据库表中的一条特定的记录。

2.管理器和查询集。

  • 查询集表示从数据库中取出来的对象的集合。它可以含有零个、一个或者多个过滤器。过滤器基于所给的参数限制查询的结果。 从SQL 的角度,查询集SELECT 语句等价,过滤器是像WHERELIMIT 一样的限制子句。
  • 每个模型都至少有一个管理器,它默认命名为objects管理器只可以通过模型的类访问,而不可以通过模型的实例访问,目的是为了强制区分“表级别”的操作和“记录级别”的操作。
>>>Blog.objects
<django.db.models.manager.Manager object at ...>
>>> b = Blog(name=‘Foo‘, tagline=‘Bar‘)
>>> b.objects
Traceback:
    ...
AttributeError: "Manager isn‘t accessible via Blog instances."

3.创建、更改,并保存一个实例

 from blog.models import Blog
 b = Blog(name=‘Beatles Blog‘, tagline=‘All the latest Beatles news.‘)
 b.save()
b.name = ‘New name‘
b.save()

  注意:在调用b.save()时,Django才正真访问数据库。

也可以使用管理器的create方法,一步创建和保存。

p = Person.objects.create(first_name="Bruce", last_name="Springsteen")
  • 更新ForeignKey 字段的方式和保存普通字段相同 —— 只要把一个正确类型的对象赋值给该字段。
  • 更新ManyToManyField 的方式有一些不同 —— 需要使用字段的add()方法来增加关联关系的一条记录。为了在一条语句中,向ManyToManyField添加多条记录,可以在调用add()方法时传入多个参数
from blog.models import Author
joe = Author.objects.create(name="Joe")
entry.authors.add(joe)

3.获取对象(大多数情况下,需要从数据库中查找对象时,会使用all()、 get()filter() 和exclude()。 然而,这只是冰山一角;查询集方法的完整列表,请参见查询集API 参考https://docs.djangoproject.com/en/1.10/ref/models/querysets/。

  • 获取所有对象
all_blogs = Blog.objects.all()

  all()方法返回包含数据库中所有对象的一个查询集

  • 可以使用filter(**kwargs),exclude(**kwargs)设置过滤条件,返回一个新的查询子集。
Entry.objects.filter(headline__startswith=‘What‘).exclude(pub_date__gte=datetime.date.today())
  • 每次筛选一个查询集,得到的都是全新的另一个查询集,它和之前的查询集之间没有任何绑定关系。每次筛选都会创建一个独立的查询集,它可以被存储及反复使用。如下:这三个查询集都是独立的。
>>> 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())
  • 查询集 是惰性执行的 —— 创建查询集不会带来任何数据库的访问。直到查询集需要求值时,Django 才会真正运行这个查询。
  • 可以使用字段查询,指定字段范围,形式为field__lookuptype=value(中间是两个下划线)。
Entry.objects.filter(pub_date__lte=‘2006-01-01‘)
Entry.objects.get(headline__exact="Man bites dog")
Blog.objects.get(name__iexact="beatles blog")
Entry.objects.get(headline__contains=‘Lennon‘)

  大约有二十多种查询的类型。查询条件中指定的字段必须是模型字段的名称。但有一个例外,对于ForeignKey你可以使用字段名加上_id 后缀。

Entry.objects.filter(blog_id=4)
  • 如果知道只有一个对象满足你的查询,可以使用管理器get() 方法,它直接返回该对象:
one_blog = Blog.objects.get(pk=1)

  如果没有结果满足查询,get() 将引发一个DoesNotExist 异常。类似地,如果有多条记录满足get() 的查询条件,Django 也将报错。这种情况将引发MultipleObjectsReturned

  • 可以使用切片和索引限制查询集。
#切片
Blog.objects.all()[5:10]
Blog.objects.all()[:10:2]
#索引
Blog.objects.order_by(‘headline‘)[0]

  通常,查询集 的切片返回一个新的查询集 —— 它不会执行查询。有一个例外,是如果你使用Python 切片语法中"step"参数。

 

Django数据操作