Django ORM 快速入门指南 数据库!

Django ORM 快速入门指南

什么是ORM?

  • Object-Relational Mapping(对象关系映射)
  • 把数据库表映射为Python类,字段映射为类属性
  • 开发者可以用Python操作数据库,无需编写SQL语句
  • 支持多种数据库:MySQL/PostgreSQL/SQLite等

快速开始

1. 定义模型

# models.py
from django.db import models

class Book(models.Model):
    title = models.CharField(max_length=200)
    author = models.ForeignKey('Author', on_delete=models.CASCADE)
    publish_date = models.DateField()
    price = models.DecimalField(max_digits=5, decimal_places=2)
    stock = models.IntegerField(default=0)

class Author(models.Model):
    name = models.CharField(max_length=100)
    email = models.EmailField(unique=True)

常用字段类型

字段类型 说明
CharField 字符串字段
TextField 长文本字段
IntegerField 整数字段
BooleanField 布尔字段
DateField/DateTimeField 日期/日期时间字段
ForeignKey 外键关联

字段参数

  • max_length:最大长度
  • default:默认值
  • unique:唯一约束
  • null:允许数据库存储NULL
  • blank:允许表单验证为空
  • verbose_name:可读名称

数据库迁移

# 生成迁移文件(在models.py修改后执行)
python manage.py makemigrations 

# 执行迁移
python manage.py migrate

基本CRUD操作

创建记录

# 方法1:先创建实例后保存
book = Book(title='Django入门', price=49.99)
book.save()

# 方法2:使用create方法
Book.objects.create(title='Python进阶', price=59.99)

查询记录

# 获取全部
all_books = Book.objects.all()

# 获取单个(唯一)
book = Book.objects.get(id=1)

# 过滤查询
cheap_books = Book.objects.filter(price__lt=50)  # price < 50
recent_books = Book.objects.filter(publish_date__year=2023)

# 排除查询
non_free = Book.objects.exclude(price=0)

# 链式查询
result = Book.objects.filter(price__gt=30).exclude(stock=0)

更新记录

book = Book.objects.get(id=1)
book.price = 55.99
book.save()

# 批量更新
Book.objects.filter(stock=0).update(stock=100)

删除记录

book = Book.objects.get(id=1)
book.delete()

# 批量删除
Book.objects.filter(price__gt=100).delete()

进阶查询

查询运算符

  • exact:精确匹配
  • iexact:不区分大小写的精确匹配
  • contains/icontains:包含查询
  • in:在列表中
  • gt/gte/lt/lte:比较运算
  • startswith/endswith:开头/结尾匹配

聚合查询

from django.db.models import Avg, Max, Min, Sum

Book.objects.aggregate(
    Avg('price'),
    Max('price'),
    Min('price')
)

Q对象(复杂查询)

from django.db.models import Q

# OR查询
Book.objects.filter(Q(price__lt=50) | Q(title__contains='Django'))

# AND查询
Book.objects.filter(Q(price__gt=30) & Q(stock__gt=0))

F表达式(字段比较)

from django.db.models import F

# 比较同一记录的不同字段
Book.objects.filter(price__gt=F('cost_price'))

# 更新时使用
Book.objects.update(stock=F('stock') + 10)

关联关系

1. 一对多(ForeignKey)

class Publisher(models.Model):
    name = models.CharField(max_length=100)

class Book(models.Model):
    publisher = models.ForeignKey(Publisher, on_delete=models.CASCADE)

# 查询关联
publisher = Publisher.objects.get(name="人民邮电出版社")
publisher.book_set.all()  # 获取该出版社所有书籍

2. 多对多(ManyToManyField)

class Author(models.Model):
    books = models.ManyToManyField(Book)

# 添加关联
author = Author.objects.get(name="张三")
author.books.add(book1, book2)

3. 一对一(OneToOneField)

class UserProfile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    phone = models.CharField(max_length=20)

事务处理

from django.db import transaction

with transaction.atomic():
    # 在这里执行数据库操作
    book.stock -= 1
    book.save()
    # 如果出现异常会自动回滚

管理后台集成

# admin.py
from django.contrib import admin
from .models import Book

@admin.register(Book)
class BookAdmin(admin.ModelAdmin):
    list_display = ('title', 'author', 'price')
    search_fields = ('title', 'author__name')

最佳实践

  1. 总是为外键设置on_delete规则
  2. 生产环境不要用SQLite
  3. 复杂查询优先考虑索引优化
  4. 批量操作使用bulk_create/update
  5. 使用select_relatedprefetch_related优化关联查询

常见问题

查询返回空?

  • 检查filter条件是否正确
  • 使用exists()检查是否存在记录
  • 确认是否执行了migrations

性能问题?

  • 使用explain()分析查询计划
  • 避免在循环中执行数据库查询
  • 使用缓存机制

你可能感兴趣的:(数据库,django,sqlite,python,后端)