【Django学习笔记 - 13】:关联查询日期查询、一对一查询、一对多查询、多对多查询

Django配置数据库utf-8编码

  1. settings.py文件中配置数据库
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'dj2022',
        'HOST': '127.0.0.1',
        'PORT': 3306,
        'USER': 'root',
        'PASSWORD': '1064865165QAF',
        'TEST': {
            'CHARSET': 'utf-8',
            'COLLATION': 'utf-8_general_ci'
        }
    }
}

SESSION_ENGINE = 'django.contrib.sessions.backends.db'

2.在Navicat中输入如下命令

CREATE DATABASE 数据库名 DEFAULT SET utf8;

在这里插入图片描述


在这里插入图片描述


在这里插入图片描述

一、日期查询

添加日期字段:
DateTimeField(verbose_name=‘’,auto_now=True)
auto_now 表示以现在的时间作为其值

日期字段的添加

  1. 创建一个模型类

在这里插入图片描述


2、进行数据库的迁移后,在终端中进入shell环境,添加字段值

在这里插入图片描述


在这里插入图片描述


3、在Navicat中进行数据的添加

在这里插入图片描述


在这里插入图片描述

日期字段的查询

1、查询生日为1993-12-14

>>> Husband_1.objects.filter(birthday='1993-12-14')
<QuerySet [<Husband_1: Husband_1 object (1)>]>

2、查询1991年后的数据

>>> Husband_1.objects.filter(birthday__gt='1991-01-01')
<QuerySet [<Husband_1: Husband_1 object (1)>, <Husband_1: Husband_1 object (3)>, <Husband_1: Husband_1 object (4)>, <Husband_1: Husband_1 object (5)>]>

3、只根据年代或月份查询

>>> Husband_1.objects.filter(birthday__year__gt='1991')
<QuerySet [<Husband_1: Husband_1 object (1)>, <Husband_1: Husband_1 object (5)>]>

>>> Husband_1.objects.filter(birthday__month__gt='8')
<QuerySet [<Husband_1: Husband_1 object (1)>, <Husband_1: Husband_1 object (4)>]>

二、F、Q对象

F对象

F对象,用于属性与属性之间进行比较
导包:from django.db.models import F
语法:filter(字段名_运算符=F(‘字段名’))

  • 例:查询身高大体重两倍的数据

>>> from django.db.models import F
>>> Husband_1.objects.filter(weight__lt=F('height')/2)
<QuerySet [<Husband_1: Husband_1 object (1)>, <Husband_1: Husband_1 object (2)>, <Husband_1: Husband_1 object (4)>]>

Q对象

Q对象,用于逻辑运算操作,与、或、非
导包:from django.db.models import Q

  1. 例1:查询大于1993年或小于1992年的数据
>>> Husband_1.objects.filter(Q(birthday__year__gt='1993')|Q(birthday__year__lt='1992'))
<QuerySet [<Husband_1: Husband_1 object (2)>, <Husband_1: Husband_1 object (3)>]>
  1. 查询除了1993年的所有数据
>>> Husband_1.objects.filter(~Q(birthday__year__gt='1993'))
<QuerySet [<Husband_1: Husband_1 object (1)>, <Husband_1: Husband_1 object (5)>]>
  1. 查询大于1992年且年龄为33的数据
>>> Husband_1.objects.filter(Q(birthday__year__gt='1992')&Q(age=33))
<QuerySet [<Husband_1: Husband_1 object (1)>, <Husband_1: Husband_1 object (5)>]>

>>> Husband_1.objects.filter(Q(birthday__year__gt='1992',age=33))
<QuerySet [<Husband_1: Husband_1 object (1)>, <Husband_1: Husband_1 object (5)>]>

三、关联查询

一对一关系

  1. 添加模型类
class Wife_1(models.Model):
    name = models.CharField(verbose_name='姓名', max_length=8)
    age = models.IntegerField(verbose_name='年龄')
    height = models.FloatField(verbose_name='身高')
    weight = models.FloatField(verbose_name='体重', null=None)
    husband = models.OneToOneField(Husband_1, verbose_name='丈夫', on_delete=models.CASCADE)

    class Meta:
        db_table = 'Wife_1'

models.OneToOneField(Husband_1,verbose_name=‘丈夫’,on_delete=models.CASCADE)
on_delete,设置表与表之间的级联
级联:将表与表之间进行联系,当主表中的数据删除时,子表中的数据也会被删除,在进行一对一的关联时,必须添加上on_delete参数

  1. 级联演示

绑定表husband_1中id为3的数据

>>> Wife_1.objects.create(name='小芳', age=30, height=168, weight=48, husband_id=3)
<Wife_1: Wife_1 object (1)>
>>> wife = Wife_1.objects.get(id=1)

>>> husband = Husband_1.objects.get(id=3)
>>> wife.husband
<Husband_1: Husband_1 object (3)>
>>> wife.husband.name
'王五'

从主表中查询子表的数据:
例如:husband.子表的模型类类名(小写).name

>>>husband.wife_1.name
'小芳'

一对多多对一

  1. 添加模型类
class Children_1(models.Model):
    Children_choice = (
        (1, '男'),
        (2, '女')
    )
    name = models.CharField(verbose_name='姓名', max_length=8)
    age = models.IntegerField(verbose_name='年龄')
    sex = models.CharField(choices=Children_choice, verbose_name='性别', max_length=2)
    father = models.ForeignKey(Husband_1, on_delete=models.CASCADE)
    mother = models.ForeignKey(Wife_1, on_delete=models.CASCADE)

    class Meta:
        db_table = 'Children_1'

2.建立连接

>>> Children_1.objects.create(name='王小五', age=10, sex='男', father_id=3, mother_id=1)
<Children_1: Children_1 object (1)>
>>> Children_1.objects.create(name='王小美', age=8, sex=2, mother_id=1)
<Children_1: Children_1 object (2)>

在这里插入图片描述

3.查询演示

>>> son = Children_1.objects.get(id=1)
>>> daughter = Children_1.objects.get(id=2)
>>> son.mother
<Wife_1: Wife_1 object (1)>
>>> daughter.father.name
'王五'

  1. 使用_set进行一对多的查询

没有related_name参数时,从‘一‘(父母)这一方查询’多‘(孩子)的一方,需要在模型类类名小写后加上’_set‘进行查询,当查询的记过可能有多个的时候,就需要再模型类类名小写后加上’_set’进行查询

>>> mother = Wife_1.objects.get(id=1)
>>> mother.children_1.set
>>> mother.children_1_set
<django.db.models.fields.related_descriptors.create_reverse_many_to_one_manager.<locals>.RelatedManager object at 0x0000026FE5696988>
>>> mother.children_1_set.all()
<QuerySet [<Children_1: Children_1 object (1)>, <Children_1: Children_1 object (2)>]>
>>> data1 = mother.children_1_set.all()
>>> data1[0].name
'王小五'

  1. 使用related_name参数

related_name参数:表示为关联的字段起一个关联名称,相当于起别名,便于开发人员进行查询

在这里插入图片描述


>>> wife = Wife_1.objects.get(id=1)
>>> wife.mother
<django.db.models.fields.related_descriptors.create_reverse_many_to_one_manager.<locals>.RelatedManager object at 0x00000272C5CD68C8>
>>> data = wife.mother.all() # 获取所有孩子的信息
>>> data
<QuerySet [<Children_1: Children_1 object (1)>, <Children_1: Children_1 object (2)>]>
>>> data[1].name
'王小美'
>>> data[0].name
'王小五'

多对多查询

  1. 添加模型类
class Brother_1(models.Model):
    Brother_choice = (
        (1, max_length=8)
    age = models.IntegerField(verbose_name='年龄')
    sex = models.CharField(choices=Brother_choice, max_length=2)
    brother = models.ManyToManyField(Husband_1, verbose_name='兄弟')
    sister = models.ManyToManyField(Wife_1, verbose_name='姐妹')

    class Meta:
        db_table = 'brother_1'

数据库表的命名格式:模型类名小写_关联字段名 -> brother_1_brother

在这里插入图片描述

  1. 演示如下
>>> Brother_1.objects.create(name='大海', age=35, sex='男')
<Brother_1: Brother_1 object (1)>
>>> brother = Brother_1.objects.get(id=1)
>>> husband = Husband_1.objects.get(id=1)
# 1、通过对象进行关联
>>> brother.brother.set([husband,])
# 2、通过id进行关联

在这里插入图片描述

原文地址:https://blog.csdn.net/Oh_Python

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


注:所有源代码均实测运行过。所有源代码均已上传CSDN,请有需要的朋友自行下载。
继承APIView和ViewSetMixin;作用也与APIView基本类似,提供了身份认证、权限校验、流量管理等。ViewSet在开发接口中不经常用。
一、Django介绍Python下有许多款不同的 Web 框架。Django是重量级选手中最有代表性的一位。许多成功的网站和APP都基于Django。Django 是一个开放源代码的 Web 应用框架,由 Python 写成。Django 遵守 BSD 版权,初次发布于 2005 年 7 月, 并于 2008 年 9 月发布了第一个正式版本 1.0 。Django学习线路Django 采用了 MVT 的软件设计模式,即模型(Model),视图(View)和模板(Template)。这个MVT模式并
本文从nginx快速掌握到使用,gunicorn快速掌握到使用,实现小白快速搭建django项目,并对可能出现的报错进行了分析
uniapp微信小程序订阅消息发送服务通知
Django终端打印SQL语句 1 Setting配置: 2 默认python 使用的MysqlDB连接,Python3 支持支持pymysql 所有需要在app里面的__init__加上下面配置:
url: re_path(&#39;authors/$&#39;, views.AuthorView.as_view()), re_path(&#39;book/(?P\d+)/$&#39;, vie
前提 关于html寻找路线: template 如果在各个APP中存在, Django 会优先找全局template 文件下的html文件,如果全局下的template文件没有相关的html Djan
// GET请求request.GET // POST请求request.POST // 处理文件上传请求request.FILES // 处理如checkbox等多选 接受列表request.get
from bs4 import BeautifulSoup#kindeditordef kindeditor(request): s = &#39;&#39;&#39; &lt;li&gt;&lt;s
view.py 配置 html 配置
from django.http import JsonResponse JsonResponse 里面代码会加这一个响应头 kwargs.setdefault(&#39;content_type&#
#下面两种是基于QuerySet查询 也就是说SQL中用的jion连表的方式查询books = models.UserInfo.objects.all() print(type(books)) &gt
return HttpResponse(&quot;OK&quot;) 返回一个字符串 return redirect(&quot;/index/&quot;) 返回URL return render
from django.http import JsonResponse JsonResponse 里面代码会加这一个响应头 kwargs.setdefault(&#39;content_type&#
浏览器有一个很重要的概念——同源策略(Same-Origin Policy)。所谓同源是指,域名,协议,端口相同。不同源的客户端脚本(javascript、ActionScript)在没明确授权的情况
自动发送 &gt; 依赖jQuery文件 实例--&gt;GET请求: 手动发送 &gt; 依赖浏览器XML对象(也叫原生ajax) Ajax主要就是使用 【XmlHttpRequest】对象来完成请
#下面两种是基于QuerySet查询 也就是说SQL中用的jion连表的方式查询books = models.UserInfo.objects.all() print(type(books)) &gt
// GET请求request.GET // POST请求request.POST // 处理文件上传请求request.FILES // 处理如checkbox等多选 接受列表request.get
return HttpResponse(&quot;OK&quot;) 返回一个字符串 return redirect(&quot;/index/&quot;) 返回URL return render