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

简介: 【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;

c9b106960cbb48d8bf3e0b4b4a636de8.png

33182505f99842ad99203a6bce8baa34.png


ed27ea113b96462dbf48c23f4baa4200.png



一、日期查询


添加日期字段:


DateTimeField(verbose_name=‘’, auto_now=True)

auto_now 表示以现在的时间作为其值


日期字段的添加

  1. 创建一个模型类

059d39b0ae994697a23c47d6d1a9d1e8.png


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

e2367b7cc0494363bb3416f097c15ebd.png

56be2e9923cc44d08218447ba87b4cb1.png

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

ff11516b8d1a48d996c26332d0beeff3.png

e0f966ef48d0460b9bcb82457801a314.png




日期字段的查询


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 (3)>, <Husband_1: Husband_1 object (4)>, <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 (3)>, <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 (3)>, <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)>]>


  2. 查询除了1993年的所有数据

>>> Husband_1.objects.filter(~Q(birthday__year__gt='1993'))
<QuerySet [<Husband_1: Husband_1 object (1)>, <Husband_1: Husband_1 object (2)>, <Husband_1: Husband_1 object (4)>, <Husband_1: Husband_1 object (5)>]>



  3. 查询大于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, father_id=3, mother_id=1)
<Children_1: Children_1 object (2)>

7c910278b22f45419b3c27dcceed8bdf.png


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参数:表示为关联的字段起一个关联名称,相当于起别名,便于开发人员进行查询


06514eae4878439193c0dcc63735ce2e.png

>>> 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, '男'),
        (2, '女')
    )
    name = models.CharField(verbose_name='姓名', max_length=8)
    age = models.IntegerField(verbose_name='年龄')
    sex = models.CharField(choices=Brother_choice, verbose_name='性别', 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

6f1bbfafd3a5463f93b3a52a1ac8c6a7.png



2.演示如下

>>> 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进行关联

e8a30ef8da0448a98a2bab74c9a1e23e.png


相关文章
|
1月前
|
SQL Go 数据库
【速存】深入理解Django ORM:编写高效的数据库查询
【速存】深入理解Django ORM:编写高效的数据库查询
57 0
|
1月前
|
SQL 前端开发 Python
基于python-django的neo4j人民的名义关系图谱查询系统
基于python-django的neo4j人民的名义关系图谱查询系统
29 0
|
4月前
|
SQL 数据库 Python
Django框架数据库ORM查询操作(6)
【7月更文挑战第6天】```markdown Django ORM常用数据库操作:1) 查询所有数据2) 根据ID查询 3) 精确查询 4) 分页排序
70 1
|
5月前
|
JSON 数据库 数据格式
使用 Django Q 对象构建复杂查询条件
通过本文示例,我们展示了如何使用Django的Q对象来构建复杂的查询条件,以及如何实现分页功能。Q对象的强大之处在于它能够轻松地组合多个查询条件,支持“与”、“或”关系,极大地提高了查询的灵活性和可读性。希望本文对你在实际项目中使用Django ORM构建复杂查询有所帮助。
|
5月前
|
存储 安全 数据库
Django ORM深度游:探索多对一、一对一与多对多数据关系的奥秘与实践
Django ORM深度游:探索多对一、一对一与多对多数据关系的奥秘与实践
|
5月前
|
存储 SQL 数据处理
Django ORM实战:模型字段与元选项配置,以及链式过滤与QF查询详解
Django ORM实战:模型字段与元选项配置,以及链式过滤与QF查询详解
|
6月前
|
数据采集 自然语言处理 Python
在 Django 中设计爬虫系统的数据模型与多对多关系
在构建爬虫系统时,设计合理的数据模型和多对多关系对系统的性能和可维护性至关重要。本文将探讨如何使用 Django 来设计爬虫系统的数据模型。
|
5月前
|
前端开发 数据库 Python
Python Django项目下的分页和筛选查询
在Django中实现分页功能,视图函数通过`Paginator`处理数据,每页显示10条记录。URL配置支持带参数和不带参数的分页请求。前端模板使用for循环展示分页数据,包括商品信息和状态按钮,并利用分页组件导航。筛选查询视图根据GET请求的`state`参数过滤上架或下架产品,同样实现分页功能。前端添加状态选择下拉框,分页链接携带查询参数`state`确保筛选状态在翻页时保持。
|
6月前
|
Python
使用Django时,如何设计模型关系(一对一、一对多、多对多)?
Django支持三种模型关联:ForeignKey(一对多),OneToOneField(一对一)和ManyToManyField(多对多)。ForeignKey示例:`Article`有一个指向`Author`的外键。OneToOneField示例:`UserProfile`与`User`一对一关联。ManyToManyField示例:`Student`和`Course`之间多对多关系。这些关联字段便于反向查询,如`article.author`获取作者,`author.article_set.all()`获取作者所有文章。
68 1
|
6月前
|
Python
基于Django的Python应用—学习笔记—功能完善
基于Django的Python应用—学习笔记—功能完善