一、创建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
方法会返回一个序列
三、filter
和get
异同总结
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/