【Django正反向生成orm】

本文介绍了使用Django进行ORM正向与反向生成的方法。正向生成涉及先定义Model再由Django创建对应的数据库表;反向生成则是先创建数据库表再生成相应的Model代码。文章提供了具体的代码示例及执行命令。

正向生成orm

正向生成,指的是先创建model.py文件,然后通过django内置的编译器,在数据库如mysql中创建出符合model.py的表。

class Student(models.Model):
    name = models.CharField(max_length=255, blank=True, null=True)
    age = models.IntegerField(blank=True, null=True)

    class Meta:
        managed = False
        db_table = 'student'

执行迁移命令:

python manage.py makemigrations
python manage.py migrate

数据库就会生成相对应的表

反向生成orm

  1. 反向生成,指的是先在数据库中create table,然后通过django内置的编译器,生成model代码。
  2. 在数据库中新建表:
create table(
name varchar(32) not null,
age int not null
);


3.执行命令: 生成module.py

python manage.py inspectdb

导入到项目中

python manage.py inspectdb >add的名称/module.py

按表明生成

python manage.py inspectdb school_schoolinfo

### Django 中的向与反向关系查询 在 DjangoORM 中,向和反向查询是处理模型间关系的核心操作。以下是关于这两种查询的详细说明: #### 1. 向查询 向查询是指从一个模型实例出发,通过外键或其他关系字段访问另一个模型的数据。例如,在引用中提到的 `Category` 模型[^2],如果存在一个外键指向 `Category` 的模型(如 `Product`),可以通过该外键直接访问 `Category` 的数据。 假设以下模型定义: ```python class Category(models.Model): id = models.CharField(primary_key=True, max_length=255) type_name = models.CharField(max_length=255) class Meta: db_table = "category" class Product(models.Model): name = models.CharField(max_length=255) category = models.ForeignKey(Category, on_delete=models.CASCADE, related_name='products') ``` 在向查询中,可以通过 `Product` 实例访问其所属的 `Category` 数据: ```python product = Product.objects.get(name="Sample Product") category_name = product.category.type_name # 向查询 ``` #### 2. 反向查询 反向查询则是从被关联的模型(如 `Category`)出发,访问所有与其相关的模型实例(如 `Product`)。Django 自动为每个外键关系生成一个默认的反向管理器,名称为 `<model>_set`,或者可以使用 `related_name` 参数自定义名称。 继续以上述模型为例,可以通过 `Category` 实例访问所有相关联的 `Product` 实例: ```python category = Category.objects.get(id="C001") products = category.products.all() # 使用 related_name='products' ``` 如果未定义 `related_name`,则需要使用默认的 `<model>_set`: ```python products = category.product_set.all() ``` #### 3. 查询优化 在实际开发中,频繁的向或反向查询可能会导致性能问题。为避免 N+1 查询问题,可以使用 `select_related` 和 `prefetch_related` 进行优化。 - **`select_related`**:适用于一对一或外键关系,预先加载相关联的模型数据。 - **`prefetch_related`**:适用于多对多或反向查询,批量加载相关联的模型数据。 示例代码如下: ```python # 使用 select_related 优化向查询 products = Product.objects.select_related('category').all() # 使用 prefetch_related 优化反向查询 categories = Category.objects.prefetch_related('products').all() ``` #### 4. 获取唯一值 如果需要获取某个字段的唯一值,可以结合 `values` 和 `distinct` 方法实现。例如: ```python unique_categories = Product.objects.values('category__id').distinct() ``` 这将生成类似 `SELECT DISTINCT category_id FROM product;` 的 SQL 语句[^3]。 --- ### 示例代码 以下是一个完整的向与反向查询示例: ```python from django.db import models class Author(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') # 向查询 author = Author.objects.get(name="J.K. Rowling") book_titles = [book.title for book in author.books.all()] # 反向查询 book = Book.objects.get(title="Harry Potter and the Sorcerer's Stone") author_name = book.author.name ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值