Django之路:QuerySet API,后台和表单

Posted 吴老二

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Django之路:QuerySet API,后台和表单相关的知识,希望对你有一定的参考价值。

一、Django QuerySet API

Django模型中我们学习了一些基本的创建和查询。这里专门讲以下数据库接口相关的接口(QuerySet API),当然你也可以选择暂时跳过这节。如果以后用到数据库相关的时候也可以在看看。

从数据库中查询出来的结果一般是一个集合,这个集合叫做QuerySet。

文中的例子大部分是基于这个blog/models.py

from django.db import models
 
 
class Blog(models.Model):
    name = models.CharField(max_length=100)
    tagline = models.TextField()
 
    def __unicode__(self):  # __str__ on Python 3
        return self.name
 
class Author(models.Model):
    name = models.CharField(max_length=50)
    email = models.EmailField()
 
    def __unicode__(self):  # __str__ on Python 3
        return self.name
 
class Entry(models.Model):
    blog = models.ForeignKey(Blog)
    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 __unicode__(self):  # __str__ on Python 3
        return self.headline

1、QuerySet 创建对象的方法

>>> from blog.models import Blog
>>> b = Blog(name=‘Beatles Blog‘, tagline=‘All the latest Beatles news.‘)
>>> b.save()
 
总之,一共有四种方法
# 方法 1
Author.objects.create(name="wulaoer", email="[email protected]")
 
# 方法 2
twz = Author(name="wulaoer", email="[email protected]")
twz.save()
 
# 方法 3
twz = Author()
twz.name="wulaoer"
twz.email="[email protected]"
 
# 方法 4,首先尝试获取,不存在就创建,可以防止重复
Author.objects.get_or_create(name="wulaoer", email="[email protected]")
# 返回值(object, True/False)

备注:前三种方法返回的都是对应的object,最后一种方法返回的是一个元组,(object,True/False),创建时返回True,已经存在时返回False

当有一对多,多对一,或者多对多的关系的时候,先把相关的对象查询出来

>>> from blog.models import Entry
>>> entry = Entry.objects.get(pk=1)
>>> cheese_blog = Blog.objects.get(name="Cheddar Talk")
>>> entry.blog = cheese_blog
>>> entry.save()

2、获取对象的方法(上一篇的部分代码)

Person.objects.all() # 查询所有
Person.objects.all()[:10] 切片操作,获取10个人,不支持负索引,切片可以节约内存,不支持负索引,后面有相应解决办法,第7条
Person.objects.get(name="wulaoer") # 名称为 wulaoer 的一条,多条会报错
 
get是用来获取一个对象的,如果需要获取满足条件的一些人,就要用到filter
Person.objects.filter(name="abc") # 等于Person.objects.filter(name__exact="abc") 名称严格等于 "abc" 的人
Person.objects.filter(name__iexact="abc") # 名称为 abc 但是不区分大小写,可以找到 ABC, Abc, aBC,这些都符合条件
 
Person.objects.filter(name__contains="abc") # 名称中包含 "abc"的人
Person.objects.filter(name__icontains="abc") #名称中包含 "abc",且abc不区分大小写
 
Person.objects.filter(name__regex="^abc") # 正则表达式查询
Person.objects.filter(name__iregex="^abc")# 正则表达式不区分大小写
 
# filter是找出满足条件的,当然也有排除符合某条件的
Person.objects.exclude(name__contains="WZ") # 排除包含 WZ 的Person对象
Person.objects.filter(name__contains="abc").exclude(age=23) # 找出名称含有abc, 但是排除年龄是23岁的

3、QuerySet是可迭代的,比如:

es = Entry.objects.all()
for e in es:
    print(e.headline)

Entry.objects.all()或者es就是QuerySet是查询所有的Entry条目。

注意事项:

(1)、如果只是检查Entry中是否有对象,应该用Entry.objects.all().exists()

(2)、  

  

 

以上是关于Django之路:QuerySet API,后台和表单的主要内容,如果未能解决你的问题,请参考以下文章

django QuerySet 的常用API

Django QuerySet API

Django基础—— 12.QuerySet常用的API

Django开发之路 二(django的models表查询)

Django开发之路 二(django的models表查询)

079:Django数据库QuerySet API详解-filterexcludeannotate