Django-ORM简介

Posted on 2022-11-27 21:38  呱呱呱呱叽里呱啦  阅读(21)  评论(0编辑  收藏  举报

Django ORM

# 即对象关系模型
# 类——表
# 对象——记录
# 对象属性(值)——记录某个字段(值)

#在models.py中写一个类
class User(models.Model):
    id = models.AutoField(primary_key=True)
    username = models.CharField(max_length=100) #CharField必须指定长度
    password = models.CharField(max_length=100, verbose_name = '密码') #verbose_name即字段名注释
# 数据库迁移命令,只要修改了models.py中关于数据库的代码就要执行以下两条迁移数据
python manage.py makemigrations #将操作记录记录到migrations文件夹

python manage.py migrate #将操作同步到数据库中
# 当没有定义主键时,ORM会自动创建一个id字段作为主键

字段的增删改查

# 在原有的类中添加属性
class User(models.Model):
    id = models.AutoField(primary_key=True)
    username = models.CharField(max_length=100)
    password = models.CharField(max_length=100)
    age = models.IntegerField(verbose_name='年龄')
# 在迁移中给出新建字段默认值
info = models.CharField(max_length=100, verbose_name='个人信息', null=True)
hobby = models.CharField(max_length=100, verbose_name='爱好', default='read')
# 修改字段
直接改类代码,然后执行迁移
# 删除字段
直接删除类中设计的字段,然后迁移

数据的增删改查

# 数据查询 eg:views.py
username = request.POST.get('username')
        password = request.POST.get('password')
        res = models.User.objects.filter(username=username) 
#返回列表[User对象1,User对象2,User对象3]
data = models.User.objects.filter() #查询所有
user_queryset = models.User.objects.all() #查询所有


# 数据增加
def register(request):
    if request.method == "POST":
        username = request.POST.get('username')
        password = request.POST.get('password')
        if models.User.objects.filter(username=username):
            return HttpResponse('用户名已存在,请使用其他用户名注册')
        res = models.User.objects.create(username=username,password=password)
        return HttpResponse(f'用户{res.username}注册成功')
    return render(request, 'register.html')

# 或
user_obj = models.User(username=username,password=password)
user_obj.save()

# 数据编辑
'''
<tbody>
    {% for user_obj in user_queryset %}
        <tr>
            <td>{{ user_obj.id }}</td>
            <td>{{ user_obj.username }}</td>
            <td>{{ user_obj.password }}</td>
            <td>{{ user_obj.age }}</td>
            <td>{{ user_obj.hobby }}</td>
            <td>{{ user_obj.info }}</td>
            <td> ***通过网页后缀传递user_id信息给编辑路由***
                <a href="/edit_user/?user_id={{ user_obj.id }}" class="btn btn-success btn-xs">编辑</a>
                <a href="/del_user/" class="btn btn-danger btn-xs">删除</a>
            </td>
        </tr>
    {% endfor %}

</tbody>
'''
def edit_user(request):
    edit_id = request.GET.get('user_id')
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        age = request.POST.get('age')
        hobby = request.POST.get('hobby')
        info = request.POST.get('info')
        # 批量更新
        models.User.objects.filter(id=edit_id).update(username=username,\
                                                                                                    password=password,age=age,hobby=hobby,info=info)
        return redirect('/userlist/')

    edit_obj = models.User.objects.filter(id=edit_id).first()

    return render(request,'edit_user.html',{'edit_obj':edit_obj})
# 数据删除
def del_user(request):
    del_id = request.GET.get('user_id')
    models.User.objects.filter(id=del_id).delete() #批量删除
    return redirect('/userlist/')
# 删除数据并不是真正的内部删除,而是修改该记录的特殊标识字段的值

创建表关系

'''
表关系:一对一、一对多、多对多
判断方法:换位思考,单向一对多即一对多,双向一对多即多对多,双向一对一即一对一
'''
# 图书表 作者表 出版社表 作者详情表
# 出版社和图书是一对多的关系,外键建在图书表
# 作者和图书是多对多的关系,应该手动创建新表-图书作者关系表:book2author,id,book_id,author_id
# 作者与作者详情是一对一的关系

# 创建表关系,先创建基表,再添加外键字段,最后一起迁移


from django.db import models


# Create your models here.
class Book(models.Model):
    title = models.CharField(max_length=32)
    price = models.DecimalField(max_digits=8, decimal_places=2)
    # 出版社和图书是一对多的关系,外键建在图书表
    publish = models.ForeignKey(to='Publish') #默认与目的表主键关联
    # 图书和作者是多对多的关系,本应新建二者关系表,在django中,外键字段建在查询频率较高的一方
    # ForeignKey对应的字段会在字段名后加'_id'生成最终的字段名
    authors = models.ManyToManyField(to='Author') # 虚拟字段,告诉ORM图书与作者多对多的关系
    # ORM会自动创建二者关系新表,创建时使用两张表的主键

class Publish(models.Model):
    name = models.CharField(max_length=32)
    addr = models.CharField(max_length=64)


class Author(models.Model):
    name = models.CharField(max_length=32)
    age = models.IntegerField()
    # 作者与作者详情是一对一的关系,外键应建在查询频率较高的表
    # OneToOneField对应的字段也会在字段名后加'_id'生成最终的字段名
    author_details = models.OneToOneField(to='AuthorDetails')

class AuthorDetails(models.Model):
    phone = models.CharField(max_length=32)
    addr = models.CharField(max_length=64)


# 在django 1.x版本中,数据库外键都是默认级联更新、级联删除的。