django数据库相关操作

2024-04-07

根据数据库表生辰model代码

django的orm可以根据model生成数据库表,也可以逆向的根据数据库表生成model

命令

# 不指定表名称将生成所有表的model
python manage.py inspectdb [表名称]

例子

python manage.py inspectdb user

输入上面的命令生成user表的model,将会输出以下内容

class AccountsAccount(models.Model):
    id = models.CharField(primary_key=True, max_length=32)
    name = models.CharField(max_length=128)
    username = models.CharField(max_length=128)

    class Meta:
        managed = False
        db_table = 'accounts_account'

数据库操作

查询操作

# 假设有一个名为Book的模型,我们想要过滤出所有作者名字为'Author Name'的书籍
books = Book.objects.filter(author='Author Name')

# 排除所有作者名字为'Author Name'的书籍
books = Book.objects.exclude(author='Author Name')

# 获取作者名字为'Author Name'且ID为1的书籍
book = Book.objects.get(author='Author Name', id=1)

# 获取所有书籍,按照价格升序排列
books = Book.objects.all().order_by('price')

# 如果你想要按照某个字段进行降序排序,
# 可以在order_by()方法中使用字段名并加上一个减号(-)作为参数。

# 获取所有书籍,按照价格降序排列
books = Book.objects.all().order_by('-price')


# 获取所有不同作者的名字,去重
authors = Author.objects.values_list('name').distinct()

# 获取所有书籍的标题和价格
books = Book.objects.values('title', 'price')
# 获取所有书籍的ID和作者名字,以元组形式
books = Book.objects.values_list('id', 'author__name')


# 模糊查询

#contains:大小写敏感,判断某个字段是否包含了某个数据。示例代码如下:
articles = Article.objects.filter(title__contains='hello')
#在翻译成SQL语句为如下:
#select ... where title like binary '%hello%';

'''
要注意的是,在使用contains的时候,
翻译成的sql语句左右两边是有百分号的,
意味着使用的#是模糊查询。而exact翻译成sql语句左右两边是没有百分号的,
意味着使用的是精确的查询。
'''

# icontains:大小写不敏感的匹配查询。示例代码如下:
articles = Article.objects.filter(title__icontains='hello')
#在翻译成SQL语句为如下:
#select ... where title like '%hello%';

# 条件or查询
from django.db.models import Q
User.objects.filter(Q(state=0) | Q(state=1))

'''
Django各种条件查询关键字:
__exact 精确等于 like ‘aaa’
__iexact 精确等于 忽略大小写 ilike ‘aaa’
__contains 包含 like ‘%aaa%’
__icontains 包含 忽略大小写 ilike ‘%aaa%’,但是对于sqlite来说,contains的作用效果等同于icontains。
'''

插入,更新,删除操作

 # 1.增加
UserInfo.objects.create(name="韩梅梅", password="123456", age=18)

# 2.删除
UserInfo.objects.filter(id=3).delete()
UserInfo.objects.all().delete()

# 5.更新数据
Department.objects.all().update(title="开发部")
Department.objects.filter(id=2).update(title="技术部")

PREV
递归算法
NEXT
vite项目打包给静态资源加自定义前缀