Django中ORM基本应用与原理解析
什么是ORM
ORM(Object-relational mapping),即对象关系映射,是一种程序设计技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换(ORM技术对应的是关系型数据库)。简单来说,ORM就是一种通过操作对象而非数据库表来操作数据库的技术。
Django的ORM是关系型数据库操作的一个工具,它将Python类与数据库中的表建立映射关系,并提供了大量的方法来对数据库进行操作。
Django ORM的基本应用
连接数据库
在使用Django ORM之前,首先需要在settings.py文件中配置连接数据库的信息。
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql', # 数据库引擎
'NAME': 'database_name', # 数据库名称
'USER': 'username', # 数据库用户名
'PASSWORD': 'password', # 数据库密码
'HOST': '127.0.0.1', # 数据库主机
'PORT': '3306', # 数据库端口号
}
}
以上配置了连接mysql数据库的信息,其他数据库引擎的配置方式也类似。
创建模型类
在Django中,每个模型类对应着一个数据库表,通过定义模型类中的字段和方法,我们可以对数据库进行增删改查操作。
假设有一个“用户”表,包含id、name、age三个字段,则可以通过以下方式定义模型类User:
from django.db import models
class User(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=30)
age = models.IntegerField()
其中,models.Model是一个基类,代表了一个表格,而id、name、age等字段则是该表格中的字段。
数据库操作
插入数据
通过创建模型类之后,可以使用模型类的对象来操作数据表。
user = User(name='张三', age=18)
user.save()
以上代码创建了一个User对象,并插入数据库。
也可以通过create()方法直接创建一个对象并插入数据库:
User.objects.create(name='李四', age=20)
查询数据
查询数据可以使用filter()方法,示例:
users = User.objects.filter(name__contains='张')
以上代码查询了所有name中包含“张”的用户。
另外,还有get()方法可以查询单条数据,示例:
user = User.objects.get(id=1)
以上代码查询了id为1的用户。
更新数据
更新数据可以使用save()方法,示例:
user = User.objects.get(id=1)
user.name = '新名字'
user.save()
以上代码将id为1的用户的name字段更新为“新名字”。
删除数据
删除数据可以使用delete()方法,示例:
user = User.objects.get(id=1)
user.delete()
以上代码删除了id为1的用户。
Django ORM的原理解析
在Django ORM的使用过程中,我们其实是在使用Django封装好的数据库访问API进行操作的,而这些API调用的是Django中的核心代码。
一般来说,在Django应用中,模型都继承自django.db.models.Model类,而Model类提供了很多数据库操作方法,比如save()、delete()等。
当我们调用save()方法时,Django会使用该模型对象的定义类中的一些元信息来生成一条SQL语句,比如INSERT语句。
Django中的ORM是基于Python的元类来实现的。元类是Python中非常重要的概念之一,它允许程序员在运行时创建类,并提供了很多高级语言特性。
Django中的Model类就是通过元类来创建的。
class ModelBase(type):
def __new__(cls, name, bases, attrs):
# 如果是模型类则添加一些方法,比如save()、delete()等
if name == 'Model':
return super(ModelBase, cls).__new__(cls, name, bases, attrs)
fields = {}
for key, value in attrs.items():
if isinstance(value, Field):
fields[key] = value
attrs_meta = attrs.get('Meta', None)
_meta = Options(attrs_meta, app_label=None)
attrs['_meta'] = _meta
attrs['fields'] = fields
new_cls = super(ModelBase, cls).__new__(cls, name, bases, attrs)
registry.register(new_cls)
return new_cls
class Model(metaclass=ModelBase):
def __init__(self, *args, **kwargs):
pass
def save(self, force_insert=False, force_update=False, using=None,
update_fields=None):
pass
def delete(self, using=None, keep_parents=False):
pass
以上是Django的一部分源码,其中ModelBase是继承自type的元类,用于创建Model类,而Model类是通过ModelBase来创建的。
示例说明
示例1:微博系统模型类定义与数据库操作
模型类的定义:
from django.db import models
class User(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=30)
age = models.IntegerField()
class Weibo(models.Model):
id = models.AutoField(primary_key=True)
content = models.TextField()
create_time = models.DateTimeField(auto_now_add=True)
author = models.ForeignKey(User, on_delete=models.CASCADE)
以上代码定义了两个模型类User和Weibo,其中Weibo类通过ForeignKey关联了User类。
插入微博数据:
user = User(name='张三', age=18)
user.save()
weibo = Weibo(content='今天天气真好', author=user)
weibo.save()
以上代码插入了一条微博数据,其中微博作者是id为1的用户。
查询某个用户发布的所有微博:
user = User.objects.get(id=1)
weibos = user.weibo_set.all()
以上代码查询id为1的用户发布的所有微博。
示例2:博客系统模型类定义与数据库操作
模型类的定义:
from django.db import models
class Author(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=30)
email = models.EmailField()
class Blog(models.Model):
id = models.AutoField(primary_key=True)
title = models.CharField(max_length=200)
content = models.TextField()
pub_time = models.DateTimeField(auto_now_add=True)
author = models.ForeignKey(Author, on_delete=models.CASCADE)
以上代码定义了两个模型类Author和Blog,其中Blog类通过ForeignKey关联了Author类。
插入博客数据:
author = Author(name='张三', email='xxx@qq.com')
author.save()
blog = Blog(title='测试博客', content='这是一篇测试博客。', author=author)
blog.save()
以上代码插入了一篇博客,其中博客作者是id为1的用户。
查询某个作者发布的所有博客:
author = Author.objects.get(id=1)
blogs = author.blog_set.all()
以上代码查询id为1的作者发布的所有博客。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Django中ORM基本应用与原理解析 - Python技术站