首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Django基础查询

查询数据

创建模型

from django.db import models

class Blog(models.Model):

name = models.CharField(max_length=100)

tagline = models.TextField()

def __str__(self):

return self.name

class Author(models.Model):

name = models.CharField(max_length=200)

email = models.EmailField()

def __str__(self):

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)

number_of_comments = models.IntegerField()

number_of_pingbacks = models.IntegerField()

rating = models.IntegerField()

def __str__(self):

return self.headline

使用单独的脚本测试模型

tests/test.py

import os

import sys

# 设置目录查找路径

sys.path.insert(0, '../../')

# 设置Django配置信息

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'hello_django.settings')

import django

django.setup()

# 导入模型

from index.models import Blog

if __name__ == "__main__":

# 测试模型

all = Blog.objects.all().values()

print(all)

创建对象

import os

import sys

# 设置目录查找路径

sys.path.insert(0, '../../')

# 设置Django配置信息

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'hello_django.settings')

import django

django.setup()

# 导入模型

from index.models import Blog

if __name__ == "__main__":

b = Blog(name='Beatles Blog', tagline='All the latest Beatles news.')

b.save()

通过create创建

import os

import sys

# 设置目录查找路径

sys.path.insert(0, '../../')

# 设置Django配置信息

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'hello_django.settings')

import django

django.setup()

# 导入模型

from index.models import Blog

if __name__ == "__main__":

b = Blog.objects.create(name='测试', tagline='abc')

使用管理器重写create方法

创建管理器:

class BlogManager(models.Manager):  # 继承默认的管理器

def create(self, name, tagline):

blog = super().create(name=name, tagline=tagline)

# 将你的个人代码放在这里

print('测试一下是否工作正常')

return blog

class Blog(models.Model):

name = models.CharField(max_length=100)

tagline = models.TextField()

objects = BlogManager()

def __str__(self):

return self.name

调用create方法创建:

import os

import sys

# 设置目录查找路径

sys.path.insert(0, '../../')

# 设置Django配置信息

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'hello_django.settings')

import django

django.setup()

# 导入模型

from index.models import Blog

if __name__ == "__main__":

b = Blog.objects.create(name='测试2', tagline='abc2')

通过save修改

import os

import sys

# 设置目录查找路径

sys.path.insert(0, '../../')

# 设置Django配置信息

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'hello_django.settings')

import django

django.setup()

# 导入模型

from index.models import Blog

if __name__ == "__main__":

b = Blog.objects.get(id=1)

b.name = "这个是id为1的blog"

b.save()

重写save方法

注意,save方法要重写,是在模型类本身上实现而不是管理器中实现的。如果我们需要在修改的前后执行某些逻辑,我们通常都需要重新实现save方法。

class Blog(models.Model):

name = models.CharField(max_length=100)

tagline = models.TextField()

objects = BlogManager()

def __str__(self):

return self.name

def save(self, *args, **kwargs):

print("执行更新之前。。。")

super().save(*args, **kwargs)  # 一定不要忘记这行代码

print("执行更新之后。。。")

调用save方法修改:

import os

import sys

# 设置目录查找路径

sys.path.insert(0, '../../')

# 设置Django配置信息

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'hello_django.settings')

import django

django.setup()

# 导入模型

from index.models import Blog

if __name__ == "__main__":

b = Blog.objects.get(id=1)

b.name = "这个是id为1的blog 2222"

b.save()

查询所有数据

import os

import sys

# 设置目录查找路径

sys.path.insert(0, '../../')

# 设置Django配置信息

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'hello_django.settings')

import django

django.setup()

# 导入模型

from index.models import Blog

if __name__ == "__main__":

print(Blog.objects.all())

查询符合条件的所有数据

准备模型

from django.db import models

class Employee(models.Model):

name = models.CharField(max_length=72)

age = models.IntegerField()

birthday = models.DateTimeField()

salary = models.DecimalField(max_digits=13, decimal_places=2)

def __str__(self):

return self.name

exact精确匹配

示例:查询名字叫Zhangsan的员工

import os

import sys

# 设置目录查找路径

sys.path.insert(0, '../../')

# 设置Django配置信息

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'hello_django.settings')

import django

django.setup()

# 导入模型

from index.models import Employee

import datetime

from django.utils import timezone

if __name__ == "__main__":

# 添加员工

tz = timezone.get_current_timezone()

zs = {

"name": "Zhangsan",

"age": 22,

"birthday": datetime.datetime(2021, 12, 12, 0, 0, 0, tzinfo=tz),

"salary": 33333,

}

Employee.objects.create(**zs)

# 查询员工

employees = Employee.objects.filter(name__exact='Zhangsan')

print(employees)

# 清空

employees.delete()

iexact不区分大小写的精确匹配

示例:查询名字叫zhangsan的员工

import os

import sys

# 设置目录查找路径

sys.path.insert(0, '../../')

# 设置Django配置信息

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'hello_django.settings')

import django

django.setup()

# 导入模型

from index.models import Employee

import datetime

from django.utils import timezone

if __name__ == "__main__":

# 添加员工

tz = timezone.get_current_timezone()

zs = {

"name": "Zhangsan",

"age": 22,

"birthday": datetime.datetime(2021, 12, 12, 0, 0, 0, tzinfo=tz),

"salary": 33333,

}

Employee.objects.create(**zs)

# 查询员工

employees = Employee.objects.filter(name__iexact='zhangsan')

print(employees)

# 清空

employees.delete()

contains包含匹配

示例:查询名字中包含sa的员工

import os

import sys

# 设置目录查找路径

sys.path.insert(0, '../../')

# 设置Django配置信息

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'hello_django.settings')

import django

django.setup()

# 导入模型

from index.models import Employee

import datetime

from django.utils import timezone

if __name__ == "__main__":

# 添加员工

tz = timezone.get_current_timezone()

zs = {

"name": "Zhangsan",

"age": 22,

"birthday": datetime.datetime(2021, 12, 12, 0, 0, 0, tzinfo=tz),

"salary": 33333,

}

Employee.objects.create(**zs)

# 查询员工

employees = Employee.objects.filter(name__contains='sa')

print(employees)

# 清空

employees.delete()

icontains不区分大小写的包含匹配

示例:查询名字中包含SA的员工

import os

import sys

# 设置目录查找路径

sys.path.insert(0, '../../')

# 设置Django配置信息

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'hello_django.settings')

import django

django.setup()

# 导入模型

from index.models import Employee

import datetime

from django.utils import timezone

if __name__ == "__main__":

# 添加员工

tz = timezone.get_current_timezone()

zs = {

"name": "Zhangsan",

"age": 22,

"birthday": datetime.datetime(2021, 12, 12, 0, 0, 0, tzinfo=tz),

"salary": 33333,

}

Employee.objects.create(**zs)

# 查询员工

employees = Employee.objects.filter(name__icontains='SA')

print(employees)

# 清空

employees.delete()

in在..之内的匹配

示例:查询名字在[‘Zhangsan’,’Lisi’]中的员工

import os

import sys

# 设置目录查找路径

sys.path.insert(0, '../../')

# 设置Django配置信息

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'hello_django.settings')

import django

django.setup()

# 导入模型

from index.models import Employee

import datetime

from django.utils import timezone

if __name__ == "__main__":

# 添加员工

tz = timezone.get_current_timezone()

zs = {

"name": "Zhangsan",

"age": 22,

"birthday": datetime.datetime(2021, 12, 12, 0, 0, 0, tzinfo=tz),

"salary": 33333,

}

Employee.objects.create(**zs)

# 查询员工

employees = Employee.objects.filter(name__in=['Zhangsan', 'Lisi'])

print(employees)

# 清空

employees.delete()

gt大于

示例:查询年龄大于20岁的员工

import os

import sys

# 设置目录查找路径

sys.path.insert(0, '../../')

# 设置Django配置信息

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'hello_django.settings')

import django

django.setup()

# 导入模型

from index.models import Employee

import datetime

from django.utils import timezone

if __name__ == "__main__":

# 添加员工

tz = timezone.get_current_timezone()

zs = {

"name": "Zhangsan",

"age": 22,

"birthday": datetime.datetime(2021, 12, 12, 0, 0, 0, tzinfo=tz),

"salary": 33333,

}

Employee.objects.create(**zs)

# 查询员工

employees = Employee.objects.filter(age__gt=20)

print(employees)

# 清空

employees.delete()

gte大于等于

示例:查询年龄大于或等于22岁的员工

import os

import sys

# 设置目录查找路径

sys.path.insert(0, '../../')

# 设置Django配置信息

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'hello_django.settings')

import django

django.setup()

# 导入模型

from index.models import Employee

import datetime

from django.utils import timezone

if __name__ == "__main__":

# 添加员工

tz = timezone.get_current_timezone()

zs = {

"name": "Zhangsan",

"age": 22,

"birthday": datetime.datetime(2021, 12, 12, 0, 0, 0, tzinfo=tz),

"salary": 33333,

}

Employee.objects.create(**zs)

# 查询员工

employees = Employee.objects.filter(age__gte=22)

print(employees)

# 清空

employees.delete()

lt小于

示例:查询年龄小于30岁的员工

import os

import sys

# 设置目录查找路径

sys.path.insert(0, '../../')

# 设置Django配置信息

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'hello_django.settings')

import django

django.setup()

# 导入模型

from index.models import Employee

import datetime

from django.utils import timezone

if __name__ == "__main__":

# 添加员工

tz = timezone.get_current_timezone()

zs = {

"name": "Zhangsan",

"age": 22,

"birthday": datetime.datetime(2021, 12, 12, 0, 0, 0, tzinfo=tz),

"salary": 33333,

}

Employee.objects.create(**zs)

# 查询员工

employees = Employee.objects.filter(age__lt=30)

print(employees)

# 清空

employees.delete()

lte小于等于

示例:查询年龄小于或等于22岁的员工

import os

import sys

# 设置目录查找路径

sys.path.insert(0, '../../')

# 设置Django配置信息

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'hello_django.settings')

import django

django.setup()

# 导入模型

from index.models import Employee

import datetime

from django.utils import timezone

if __name__ == "__main__":

# 添加员工

tz = timezone.get_current_timezone()

zs = {

"name": "Zhangsan",

"age": 22,

"birthday": datetime.datetime(2021, 12, 12, 0, 0, 0, tzinfo=tz),

"salary": 33333,

}

Employee.objects.create(**zs)

# 查询员工

employees = Employee.objects.filter(age__lte=22)

print(employees)

# 清空

employees.delete()

startswith从开头匹配

示例:查询名字以Zh开头的员工

import os

import sys

# 设置目录查找路径

sys.path.insert(0, '../../')

# 设置Django配置信息

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'hello_django.settings')

import django

django.setup()

# 导入模型

from index.models import Employee

import datetime

from django.utils import timezone

if __name__ == "__main__":

# 添加员工

tz = timezone.get_current_timezone()

zs = {

"name": "Zhangsan",

"age": 22,

"birthday": datetime.datetime(2021, 12, 12, 0, 0, 0, tzinfo=tz),

"salary": 33333,

}

Employee.objects.create(**zs)

# 查询员工

employees = Employee.objects.filter(name__startswith='Zh')

print(employees)

# 清空

employees.delete()

istartswith不区分大小写从开头匹配

示例:查询名字以zhang开头的员工

import os

import sys

# 设置目录查找路径

sys.path.insert(0, '../../')

# 设置Django配置信息

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'hello_django.settings')

import django

django.setup()

# 导入模型

from index.models import Employee

import datetime

from django.utils import timezone

if __name__ == "__main__":

# 添加员工

tz = timezone.get_current_timezone()

zs = {

"name": "Zhangsan",

"age": 22,

"birthday": datetime.datetime(2021, 12, 12, 0, 0, 0, tzinfo=tz),

"salary": 33333,

}

Employee.objects.create(**zs)

# 查询员工

employees = Employee.objects.filter(name__istartswith='zhang')

print(employees)

# 清空

employees.delete()

endswith从结尾处匹配

示例:查询名字以san结尾的员工

import os

import sys

# 设置目录查找路径

sys.path.insert(0, '../../')

# 设置Django配置信息

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'hello_django.settings')

import django

django.setup()

# 导入模型

from index.models import Employee

import datetime

from django.utils import timezone

if __name__ == "__main__":

# 添加员工

tz = timezone.get_current_timezone()

zs = {

"name": "Zhangsan",

"age": 22,

"birthday": datetime.datetime(2021, 12, 12, 0, 0, 0, tzinfo=tz),

"salary": 33333,

}

Employee.objects.create(**zs)

# 查询员工

employees = Employee.objects.filter(name__endswith='san')

print(employees)

# 清空

employees.delete()

iendswith不区分大小写从结尾处匹配

示例:查询名字以SAN结尾的员工

import os

import sys

# 设置目录查找路径

sys.path.insert(0, '../../')

# 设置Django配置信息

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'hello_django.settings')

import django

django.setup()

# 导入模型

from index.models import Employee

import datetime

from django.utils import timezone

if __name__ == "__main__":

# 添加员工

tz = timezone.get_current_timezone()

zs = {

"name": "Zhangsan",

"age": 22,

"birthday": datetime.datetime(2021, 12, 12, 0, 0, 0, tzinfo=tz),

"salary": 33333,

}

Employee.objects.create(**zs)

# 查询员工

employees = Employee.objects.filter(name__iendswith='SAN')

print(employees)

# 清空

employees.delete()

range范围匹配

示例:查询年龄在20-30岁之间的员工

import os

import sys

# 设置目录查找路径

sys.path.insert(0, '../../')

# 设置Django配置信息

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'hello_django.settings')

import django

django.setup()

# 导入模型

from index.models import Employee

import datetime

from django.utils import timezone

if __name__ == "__main__":

# 添加员工

tz = timezone.get_current_timezone()

zs = {

"name": "Zhangsan",

"age": 22,

"birthday": datetime.datetime(2021, 12, 12, 0, 0, 0, tzinfo=tz),

"salary": 33333,

}

Employee.objects.create(**zs)

# 查询员工

employees = Employee.objects.filter(age__range=(20, 30))

print(employees)

# 清空

employees.delete()

示例2:查询生日在1993年-2022年出生的员工

import os

import sys

# 设置目录查找路径

sys.path.insert(0, '../../')

# 设置Django配置信息

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'hello_django.settings')

import django

django.setup()

# 导入模型

from index.models import Employee

import datetime

from django.utils import timezone

if __name__ == "__main__":

# 添加员工

tz = timezone.get_current_timezone()

zs = {

"name": "Zhangsan",

"age": 22,

"birthday": datetime.datetime(2021, 12, 12, 0, 0, 0, tzinfo=tz),

"salary": 33333,

}

Employee.objects.create(**zs)

# 生日1993-2022年

start = datetime.datetime(1993, 1, 1, 0, 0, 0, tzinfo=tz)

end = datetime.datetime(2022, 1, 1, 0, 0, 0, tzinfo=tz)

# 查询员工

employees = Employee.objects.filter(birthday__range=[start, end])

print(employees)

# 清空

employees.delete()

上面问题的其他方案:

Employee.objects.filter(birthday__gt=start).filter(birthday__lt=end)

Employee.objects.filter(birthday__gt=start, birthday__lt=end)

这里这个案例主要需要学习到以下知识点:

除了数字类型支持range意外,日期类型也是支持range的

filter支持多个调用链,多个filter之间是且的关系,查询结果要同时满足所有filter给出的条件

filter的参数可以有多个,默认多个参数之间是且关系,查询结果必须要同时满足filter中给出的所有条件

year年份

示例:查询2021年出生的员工

import os

import sys

# 设置目录查找路径

sys.path.insert(0, '../../')

# 设置Django配置信息

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'hello_django.settings')

import django

django.setup()

# 导入模型

from index.models import Employee

import datetime

from django.utils import timezone

if __name__ == "__main__":

# 添加员工

tz = timezone.get_current_timezone()

zs = {

"name": "Zhangsan",

"age": 22,

"birthday": datetime.datetime(2021, 12, 12, 0, 0, 0, tzinfo=tz),

"salary": 33333,

}

Employee.objects.create(**zs)

# 查询员工

employees = Employee.objects.filter(birthday__year=2021)

print(employees)

# 清空

employees.delete()

month月份

示例:查询12月份出生的员工

import os

import sys

# 设置目录查找路径

sys.path.insert(0, '../../')

# 设置Django配置信息

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'hello_django.settings')

import django

django.setup()

# 导入模型

from index.models import Employee

import datetime

from django.utils import timezone

if __name__ == "__main__":

# 添加员工

tz = timezone.get_current_timezone()

zs = {

"name": "Zhangsan",

"age": 22,

"birthday": datetime.datetime(2021, 12, 12, 0, 0, 0, tzinfo=tz),

"salary": 33333,

}

Employee.objects.create(**zs)

# 查询员工

employees = Employee.objects.filter(birthday__month=12)

print(employees)

# 清空

employees.delete()

day日期

示例:查询12号出生的员工

import os

import sys

# 设置目录查找路径

sys.path.insert(0, '../../')

# 设置Django配置信息

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'hello_django.settings')

import django

django.setup()

# 导入模型

from index.models import Employee

import datetime

from django.utils import timezone

if __name__ == "__main__":

# 添加员工

tz = timezone.get_current_timezone()

zs = {

"name": "Zhangsan",

"age": 22,

"birthday": datetime.datetime(2021, 12, 12, 0, 0, 0, tzinfo=tz),

"salary": 33333,

}

Employee.objects.create(**zs)

# 查询员工

employees = Employee.objects.filter(birthday__day=12)

print(employees)

# 清空

employees.delete()

查询不符合条件的所有数据

exclude(**kwargs):返回除了根据指定参数查询出来结果的QuerySet。

示例:查询名字里不包含Lisi的员工

import os

import sys

# 设置目录查找路径

sys.path.insert(0, '../../')

# 设置Django配置信息

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'hello_django.settings')

import django

django.setup()

# 导入模型

from index.models import Employee

import datetime

from django.utils import timezone

if __name__ == "__main__":

# 添加员工

tz = timezone.get_current_timezone()

zs = {

"name": "Zhangsan",

"age": 22,

"birthday": datetime.datetime(2021, 12, 12, 0, 0, 0, tzinfo=tz),

"salary": 33333,

}

Employee.objects.create(**zs)

# 查询员工

employees = Employee.objects.exclude(name__contains='Lisi')

print(employees)

# 清空

employees.delete()

F表达式

查询 JSONField

Q对象

  • 发表于:
  • 原文链接https://page.om.qq.com/page/O68drQPT5NJ_XpqG7eBWjHmg0
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券