django之Model理解,一张表的增删改查

本文详细介绍ORM概念及其在Python中的应用,包括如何通过Python类映射数据库表,以及使用ORM进行数据库记录的增删改查操作。

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

一、表与表之间的对应关系(两张表)

1、一对多
2、多对多
3、一对一

二、ORM (object relation mapping) 对象关系映射表

1、每一个python类对应一个数据库表。
2、一个类的实例就是表的一条记录,表的一行。
3、ORM使操作数据库变得简单易行,而且完全不用考虑sql语句,避免新手写sql语句带来的性能的问题。快速开发,由此而来。

三、操作步骤

1、设置数据库(默认sqlite3数据库)
1.1

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}

1.2 设置mysql数据库

#我们将Django框架的数据库设置为MySQL,首先需要安装 pymsql 模块库(Python3)
#在工程文件夹的 __init__.py 初始化配置文件中,添加如下代码:
import pymysql # 导入mysql库
pymysql.install_as_MySQLdb() # 设置pymsql为Django默认数据库连接驱动

#配置设置(settings)
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',   # 数据库引擎
        'NAME': 'mydata',       # 你要存储数据的库名,事先要创建之
        'USER': 'root',         # 数据库用户名
        'PASSWORD': '0000',     # 密码
        'HOST': 'localhost',    # 主机
        'PORT': 3306,         # 数据库使用的端口
    }
}

2、在app下面的 models.py 写类

class Users(models.Model):
    account = models.CharField(max_length=30)
    password = models.CharField(max_length=20)
    nickname = models.CharField(max_length=20)
    headimg = models.CharField(max_length=100)
    sex = models.CharField(max_length=2)
    city = models.CharField(max_length=20)
    personsign = models.CharField(max_length=50)
    
  	def __str__(self):
   		 return self.nickname

注:如果没有设置主键,则自动设置一个主键。

3、运行命令,创建数据库表

python manage.py makemigrations

python manage.py migrate

4、表记录的添加

  • 方式一
u = Users(account=account,password=password1,
nickname=nickname,sex=sex,city=city,personsign=personsign)
u.save()
  • 方式二
    Users.object.create()

5、表记录的修改

  • 方式一(建议用)
Users.objects.filter(account='shi').update(password='123')      
  • 方式二(效率低,会给每一个属性重新赋值)
u = Users.objects.get(account='shi')       #get  没有update方发 
u.personsign='哈哈哈'         
u.save()

6、表记录的删除

Users.objects.filter(account='shi').delete

7、表记录的查询

  • 查询可迭代的记录
user_list = Users.objects.all()    #user_list  是一个QuerySet列表,可以进行切片
user_list = Users.objects.all() [:3]    #前3条   
user_list = Users.objects.all() [::2]   #2是步长 
user_list = Users.objects.all() [::-1]   #倒着显示
user_list = Users.objects.filter(id=2)  #仍然是可迭代的对象,只包含一个   
  • 查询单个记录
user = Users.objects.get(id=2)  #一般get用主键查,因为get只去一条记录,取多条或零条都会报错。
  • 查询一个或多个字段,不要一个对象
#查询所有男生的昵称和账号,得到一个QuerySet列表,里面是字典
ret = Users.objects.filter(sex='男').values('nickname','account')   
#查询所有男生的昵称和账号,得到一个QuerySet列表,里面是元组
ret = Users.objects.filter(sex='男').values——list('nickname','account')   
  • 反查询(exclude)
#查询所有男生的昵称和账号,得到一个QuerySet列表,里面是字典
ret = Users.objects.exclude(sex='男').values('nickname','account')   
  • order_by() 对查询结果排序
  • reverse() 对查询结果反向排序
  • distinct() 对查询结果去除
  • count() 数出查询结果有几个

8、模糊查询(双下划线)

ret = Users.objects.filter(account__icontains='1').values('nickname','account')   
__exact 精确等于 like ‘aaa’
__iexact 精确等于 忽略大小写 ilike ‘aaa’
__contains 包含 like ‘%aaa%’
__icontains 包含 忽略大小写 ilike ‘%aaa%’,但是对于sqlite来说,contains的作用效果等同于icontains。
__gt 大于
__gte 大于等于
__lt 小于
__lte 小于等于
__in 存在于一个list范围内
__startswith 以…开头
__istartswith 以…开头 忽略大小写
__endswith 以…结尾
__iendswith 以…结尾,忽略大小写
__range 在…范围内
__year 日期字段的年份
__month 日期字段的月份
__day 日期字段的日
__isnull=True/False
__isnull=True 与 __exact=None的区别
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值