Django model中filter和get的区别

一、创建Django项目供测试

新建一个mysite项目验证

django-admin startproject mysite

查看目录结构

#tree 
.
└── mysite
    ├── manage.py
    └── mysite
        ├── __init__.py
        ├── settings.py
        ├── urls.py
        └── wsgi.py

2 directories, 5 files

修改settings.py添加本地数据库相关信息

创建polls app,并添加至settings.py

python manage.py startapp polls

#tree
.
└── mysite
    ├── manage.py
    ├── mysite
    │   ├── __init__.py
    │   ├── settings.py
    │   ├── urls.py
    │   └── wsgi.py
    └── polls
        ├── admin.py
        ├── __init__.py
        ├── migrations
        │   └── __init__.py
        ├── models.py
        ├── tests.py
        └── views.py

4 directories, 13 files

# Application definition

INSTALLED_APPS = (
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'polls',   # 添加
)

新建model 类:

# coding=utf-8
from django.db import models

class Students(models.Model):
    name = models.CharField('姓名', default='', max_length=200)
    age = models.IntegerField('年龄',null=True)
    grade = models.CharField('年级', default='first', max_length=200)

迁移数据注册数据表本地数据库

python manage.py makemigrations polls
Migrations for 'polls':
  0001_initial.py:
    - Create model Students

python manage.py migrate
Operations to perform:
  Synchronize unmigrated apps: staticfiles, messages
  Apply all migrations: admin, contenttypes, polls, auth, sessions
Synchronizing apps without migrations:
  Creating tables...
    Running deferred SQL...
  Installing custom SQL...
Running migrations:
  Rendering model states... DONE
  Applying contenttypes.0001_initial... OK
  Applying auth.0001_initial... OK
  Applying admin.0001_initial... OK
  Applying contenttypes.0002_remove_content_type_name... OK
  Applying auth.0002_alter_permission_name_max_length... OK
  Applying auth.0003_alter_user_email_max_length... OK
  Applying auth.0004_alter_user_username_opts... OK
  Applying auth.0005_alter_user_last_login_null... OK
  Applying auth.0006_require_contenttypes_0002... OK
  Applying polls.0001_initial... OK
  Applying sessions.0001_initial... OK

插入数据:

insert into students(id,name,age,grade) values(1,'zhangsan',12,'first');
insert into students(id,name,age,grade) values(2,'lisi',12,'second');
insert into students(id,name,age,grade) values(3,'wangwu',13,'third');

mysql> select * from students;
+----+----------+------+--------+
| id | name     | age  | grade  |
+----+----------+------+--------+
|  1 | zhangsan |   12 | first  |
|  2 | lisi     |   12 | second |
|  3 | wangwu   |   13 | third  |
+----+----------+------+--------+
3 rows in set (0.01 sec)

views.py 创建方法调用

from django.shortcuts import render

# Create your views here.

from django.views.decorators.csrf import csrf_exempt
from django.http import JsonResponse

from common.result import result_dict
from models import Students
import functools





def api_method(method):
    def decoration(func):
        @functools.wraps(func)
        def wraps(*args, **kwargs):
            request = args[0]
            if isinstance(method, list) and request.method not in method:
                raise Http404
            if isinstance(method, str) and request.method != method:
                raise Http404
            return func(*args, **kwargs)
        return wraps
    return decoration


@csrf_exempt
@api_method("POST")
def filter_test(request):
    students = Students.objects.filter(age=12)
    print "=========================filter============="
    print students
    print type(students)
    print "=========================filter============="
    data = [student.pack_data() for student in students]
    return result_dict(200, data=data)


@csrf_exempt
@api_method("POST")
def get_test(request):
    students = Students.objects.get(pk=2)
    print "=========================get============="
    print students
    print type(students)
    print "=========================get============="
    data = students.pack_data()
    return result_dict(True, data=data)

启动Django调试:

python manage.py runserver 0.0.0.0:5050

调用开放的接口:

def call_dj():
    api_url = "http://11.164.61.51:5050/polls/get"
    reponse = requests.post(api_url).content
    print reponse


call_dj()

二、测试不同数据

2.1、数据库中包含数据

get:

students = Students.objects.get(pk=2)

filter:

students = Students.objects.filter(age=12)

结果如下:

# 当前结果如下
get 方法:
=========================get===============
Students object
<class 'polls.models.Students'>
=========================get===============

filter 方法:
=========================filter=============
[<Students: Students object>, <Students: Students object>]
<class 'django.db.models.query.QuerySet'>
============================================

由上可见:
get 返回值是一个定义的model对象
filter的返回值是一个QuerySet的集合对象

2.2、数据库中不包含数据

get:

students = Students.objects.get(pk=4)

filter:

students = Students.objects.filter(age=18)

结果如下:

# 当前结果如下
get 方法:
DoesNotExist at /polls/get
Students matching query does not exist.

filter 方法:
=========================filter=============
[]
<class 'django.db.models.query.QuerySet'>
============================================

由上可见:
对于不存在的数据,使用gat方法会报错
对于不存在的数据,使用filter方法会返回一个空序列

2.3、数据库中包含多条数据

get:

students = Students.objects.get(age=12)

filter:

students = Students.objects.filter(age=12)

结果如下:

# 当前结果如下
get 方法:
MultipleObjectsReturned at /polls/get
get() returned more than one Students -- it returned 2!

filter 方法:
=========================filter=============
[<Students: Students object>, <Students: Students object>]
<class 'django.db.models.query.QuerySet'>
============================================

由上可见:
对于存在多条数据,使用gat方法会报错
对于存在多条数据,使用filter方法会返回一个序列

三、filterget异同总结

1、get 返回值是一个定义的model对象,filter的返回值是一个QuerySet的集合对象,QuerySet可使用迭代或者遍历,切片等,但是不等于list类型(是一个object对象集合)
2、当含有多条数据或者没有数据时,get 会报错,filter 会返回集合或者[]
3、get 多用于查询主键字段或者具有唯一性约束的字段

四、参考文档:

1、https://www.cnblogs.com/gentlemanhai/p/11924931.html
2、https://blog.csdn.net/m0_53977548/article/details/125298805
3、https://docs.djangoproject.com/zh-hans/4.1/intro/tutorial01/

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值