小白IT:ORM重难点多表(跨表)查询、分组、python脚本怎么调用django 环境等

本文详细介绍了Django ORM中的多表模型创建,包括一对一、一对多、多对多关系的建立与操作。接着讨论了多表查询的重难点,如基于对象和双下划线的跨表查询、聚合与分组查询,以及F和Q查询的使用。此外,还涵盖了如何在ORM中执行原生SQL语句和在python脚本中调用Django环境。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、多表模型创建

1.数据库中的表关系

在数据库中表与表之间的关系分:一对一,一对多,多对多

  • 一对一的表关系通过外键+唯一约束表示
  • 一对多的表关系通过外键约束来表示,一对多和多对一是相对而言的。
  • 多对多的表关系通过建立第三张表设置外键来表示

在这里插入图片描述

2.ORM中的类关系模型

在orm中,表与表之间的关系通过类名来建立,类名中定义属性关联另一个类。

  • 一对一的类关系通过OneToOneField()来建立
  • 一对多的类关系通过ForeignKey()来建立
  • 多对多的类关系通过ManyToManyField()来建立

orm中模型建立models.py文件

orm中model.py文件

from django.db import models
# Create your models here.class Author(models.Model):
    id = models.AutoField(primary_key=True)  # 可以省略
    name = models.CharField(max_length=32)
    age = models.IntegerField()class Publish(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=32)
    # 一对一关系建立,本质就是foreignkey+unique,orm中会自动给这个字段拼接一个_id。
    authorDetail = models.OneToOneField(to="PublishDetail", to_field="id", on_delete=models.CASCADE)  # 设置联级更新,默认选项class PublishDetail(models.Model):
    id = models.AutoField(primary_key=True)
    telephone = models.BigIntegerField()
    city = models.CharField(max_length=32)class Book(models.Model):
    id = models.AutoField(primary_key=True)
    title = models.CharField(max_length=32)
    price = models.DecimalField(max_digits=5,decimal_places=2)
    # 多对一关系,外键关联出版社表
    publish = models.ForeignKey(to="Publish", to_field="id", on_delete=models.CASCADE)
    # 建立表之间的多对多关系
    authors=models.ManyToManyField(to="Author")  # mysql中需要我们手动建立第三张表,而orm中自动帮我们建立第三张表

注意
  • 一对多表关系建立,外键字段建立在多的一方
  • 多对多表关系中,外键会默认关联表的主键id,第三张表创建方式有多种。
  • 创建多对多的authors名字,并不会在Book表中生成对应字段,而authors是用于多表查询的。

创建第三张表的方式

1.手
### Django ORM 查询与 Oracle 数据库连接 #### 一、Django ORM查询基础 在 Django 中,ORM 提供了一种强大的方式来处理复杂的数据库关系。以下是几种常见的查询场景及其实现方法: 1. **连接查询** 当两个模型之间存在外键关系时,可以通过 `select_related` 或 `prefetch_related` 方法优化查询性能并获取关联对象的数据[^2]。 ```python from myapp.models import A, B # 假设A和B有外键关系 (A -> B),使用 select_related 获取单个关联对象 result = A.objects.select_related('b').filter(name='example') # 如果是对一的关系,则可以使用 prefetch_related result = A.objects.prefetch_related('b_set').all() ``` 2. **条件过滤** 可以通过双下划线语法访问关联字段,并基于这些字段进行复杂过滤[^3]。 ```python # 查询所有 name 字段等于 'example' 并且 b__field_name 等于某个值的对象 results = A.objects.filter(name='example', b__field_name='value') ``` 3. **反向查询** 对于外键关系中的目标模型,可以直接通过 `_set` 属性进行反向查询。 ```python # 查找所有属于特定 B 实例的 A 记录 specific_b_instance = B.objects.get(id=1) related_a_records = specific_b_instance.a_set.all() ``` --- #### 二、Django 连接 Oracle 数据库的方法 为了使 Django 支持 Oracle 数据库,需要安装第三方驱动程序 `cx_Oracle` 和配置项目的 `settings.py` 文件。 1. **安装依赖** 安装必要的 Python 库以支持 Oracle 数据库连接。 ```bash pip install cx_Oracle django-oracle-base ``` 2. **修改 settings.py 配置文件** 在项目根目录下的 `settings.py` 文件中调整 DATABASES 设置项。 ```python DATABASES = { 'default': { 'ENGINE': 'django.db.backends.oracle', 'NAME': 'your_oracle_sid', # 替换为实际 SID 'USER': 'your_username', # 替换为数据库用户名 'PASSWORD': 'your_password', # 替换为密码 'HOST': 'localhost', # 替换为主机地址 'PORT': '1521', # 默认端口为 1521 } } ``` 3. **验证连接** 执行以下命令测试是否成功连接到 Oracle 数据库。 ```bash python manage.py migrate --run-syncdb ``` 如果一切正常,应该可以看到迁移脚本被应用至指定的 Oracle 数据库实例上。 --- #### 三、综合示例:查询结合 Oracle 数据库 假设有一个简单的图书管理系统,其中包含三个主要实体——作者 (`Author`)、书籍 (`Book`) 和出版社 (`Publisher`)。它们之间的关系如下: - 每位作者可以写本书(一对)。 - 每本书由一家出版社出版(一对)。 ##### 模型定义 ```python from django.db import models class Author(models.Model): name = models.CharField(max_length=100) class Publisher(models.Model): name = models.CharField(max_length=100) class Book(models.Model): title = models.CharField(max_length=200) author = models.ForeignKey(Author, on_delete=models.CASCADE, related_name="books") publisher = models.ForeignKey(Publisher, on_delete=models.CASCADE, related_name="books") class Meta: db_table = "book" ``` ##### 查询示例 1. **查找某一作者的所有书籍以及对应的出版社** ```python author_books_with_publisher = ( Book.objects.select_related('author', 'publisher') .filter(author_id=1) # 假定作者 ID 是 1 ) for book in author_books_with_publisher: print(f"{book.title} by {book.author.name}, published by {book.publisher.name}") ``` 2. **统计每家出版社发行的不同书籍数量** ```python distinct_book_counts_per_publisher = ( Publisher.objects.annotate(book_count=models.Count('books')) .values('name', 'book_count') ) for entry in distinct_book_counts_per_publisher: print(f"Publisher: {entry['name']}, Books Count: {entry['book_count']}") ``` 上述代码片段展示了如何利用 Django ORM 结合 Oracle 数据库完成高效的查询操作。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值