django 数据库 多表操作

model.py

python 复制代码
from django.contrib.auth.models import User
from django.db import models

# Create your models here.
#继承models.Model成为模型类
#模型就是一个数据表
#类字段就是表字段
#实例化对象就是表数据
#class 定义类
#classes分类   类名
#创建完模型类之后都需要迁移映射

'''
int            IntegerField  整形
varchar        CharField 字符类型
longtext       TextField  文本类型
date          DateField  日期类型
             BooleanField 布尔类型
            DateTimeField   日期时间类型
ImageField 图片文件类型
FileField   文件类型
AutoField    自增长类型

字段的常用属性   表约束
unique
null  默认就是非空  指定为True
primary_key      主键
default   默认值
blank  表单提交的值可以为空  form
datefield.autonow 每次修改都会将当前时间更新进去
datefield.autonow_add  第一次会添加,会将当前时间设置进去,以后不会修改这个值

'''
class Classes(models.Model):
    #设置自增长约束 主键约束
    id=models.AutoField(primary_key=True)
    #限制最长字段值为50 默认都有非空约束,设置可以不空 null=True
    name=models.CharField(max_length=50)


    #重写输出魔法方法
    def __str__(self):
        return 'Classes<name=%s>'%self.name
#创建标签模型
class Label(models.Model):
    name=models.CharField(max_length=50,unique=True)

    #重写输出魔法方法
    def __str__(self):
        return 'Lavel<name=%s>'%self.name

#创建用户详情表
class UserDetail(models.Model):
    #blank = True  前端的传值可以为空  null=True 数据表中的值可以为空
    age=models.IntegerField(null=True,blank=True)
    sex=models.BooleanField(null=True,blank=True)
    #关联用户表 指定user表的数据被删除时,用户详情表一起被删除
    user=models.OneToOneField(User,on_delete=models.CASCADE)

#创建文章表
class Article(models.Model):
    #文章标题
    title=models.CharField(max_length=50)
    #文章简介
    desc=models.CharField(max_length=100)
    #文章内容
    content=models.TextField()
    #封面图   实际上保存的是图片的地址  路由 图片保存在服务器当中
    cover=models.TextField()
    #创建时间 日期时间类型
    create_time=models.DateTimeField(auto_now_add=True)
    #更新时间
    update_time=models.DateTimeField(auto_now=True)

    #建立表关系  约束
    #跟文章分类的表约束 NOT_PROVIDED 当分类表删除时,还有文章 限制分类不能被删除
    #第一个参数是您要关联的表,第二鼐参数是删除行为
    classes=models.ForeignKey(Classes,on_delete=models.NOT_PROVIDED)
    #下面的定义 访问 不用 article_set  而是a   自定义管理器名字  related_name='a'
    #classes = models.ForeignKey(Classes, on_delete=models.NOT_PROVIDED,related_name='a')

    #跟用户表的表约束      当user表中被删除时  它对应的内容也会一起被删除
    user=models.ForeignKey(User,on_delete=models.CASCADE)
    #多对多表关系建立   建立删除行为 因为多对多会产生关系表
    #关系表会自动创建
    label=models.ManyToManyField(Label)

    def __str__(self):
        return 'Aeticle<title=%s>'%self.title

views.py

python 复制代码
from .models import *

def tab_info(request,**kwargs):
    #一对一数据表数据添加
    #创建一个用户对象    密码是文明保存
    # user=User(username='rose')
    # #密码进行加密操作
    # user.set_password('123456')
    # user.save()   #保存加密后的密码

    #创建上个用户详情对象
    #如果上面有用户对象则直接关联用户对象
    #UserDetail.objects.create(age=20,sex=0,user=user)

    #如果没有对应的关联用户对象,可以通过用户id指定关联的用户对象
    #UserDetail.objects.create(age=20, sex=0, user_id=2)

    #一对一数据查询
    #获取用户为lisa的年龄
    #先获取用户对象
    #因为用户表关联了用户详情表,所有用户对象拥有用户详情表属性 相当于用户得到了用户详情对象
    # ,可以直接通过.字段名获取对应属性
    # user=User.objects.get(username='lisa')
    # print(user.userdetail.age)
    #
    # #获取id为1的用户详情的名字
    # userdetail=UserDetail.objects.get(user_id=1)
    # print(userdetail.user.username)

    #一对多表数据添加
    #创建一个分类对象
    # classes=Classes.objects.create(name="test")
    # article=Article(title='text',desc='test',content='test_content',cover='https://i-blog.csdnimg.cn/blog_migrate/7244c3bfd55d6b5df51542571d490665.png#pic_center',
    #         user_id=1,classes=classes)
    # article.save()
    # article=Article(title='text111',desc='test111',content='test_content',cover='https://i-blog.csdnimg.cn/blog_migrate/7244c3bfd55d6b5df51542571d490665.png#pic_center',
    #          user_id=1,classes_id=7)
    # article.save()

    #一对多的数据查询
    #得到test分类下的所有文章对象
    #第一步得到test分类
    # classes=Classes.objects.get(name='test')
    # #print(classes.article_set.all())
    #
    # #得到test分类下 文章名字为test文章内容
    # print(classes.article_set.get(title="text").content)

    #一对多管理器表数据添加
    # classes=Classes.objects.get(name='python')
    # classes.article_set.create(title="test222",desc="test222",content="test222",
    #                            cover='https://i-blog.csdnimg.cn/blog_migrate/7244c3bfd55d6b5df51542571d490665.png#pic_center',
    #                            user_id=1,classes=classes)

    #一对多管理器表修改  添加        修改分类
    # classes = Classes.objects.get(name='python')
    # classes.article_set.add(Article.objects.get(title='text111'))

    #多对多的数据添加
    #给text这往届文章添加两个标签
    # article=Article.objects.get(title='text111')
    # article.label.create(name="test112")
    # article.label.create(name="test223")

    #添加关系表中
    article = Article.objects.get(title='text111')
    # print(article)
    # print(Label.objects.get(name="test111"))
    article.label.add(Label.objects.get(name="test111"))


    #表数据删除
    #删除的是关系表中的记录,不会删除标签表的标签数据
    # article = Article.objects.get(title='text111')
    # label=Label.objects.get(name='test222')
    # article.label.remove(label)

    #删除全部数据    也是删除的是关系表中的数据
    # article = Article.objects.get(title='text111')
    # article.label.clear()

    #多表查询
    #获取文章标题为text111的标签
    # article = Article.objects.get(title='text111')
    # print(article.label.all())
    #
    # label=Label.objects.get(name="test112")
    # print(label.article_set.all())


    #获取id为5的分类的文章的用户详情
    print(UserDetail.objects.filter(user__article__classes=5))

    #获取的是python分类下的所有文章
    res1=Article.objects.filter(classes__name="python")
    for i in res1:
        print(i.title,i.desc)


    return HttpResponse('成功')
相关推荐
unicrom_深圳市由你创科技4 分钟前
做虚拟示波器这种实时波形显示的上位机,用什么语言?
c++·python·c#
小敬爱吃饭4 分钟前
Ragflow Docker部署及问题解决方案(界面为Welcome to nginx,ragflow上传文件失败,Docker中的ragflow-cpu-1一直重启)
人工智能·python·nginx·docker·语言模型·容器·数据挖掘
一个天蝎座 白勺 程序猿6 分钟前
Apache IoTDB(15):IoTDB查询写回(INTO子句)深度解析——从语法到实战的ETL全链路指南
数据库·apache·etl·iotdb
宸津-代码粉碎机11 分钟前
Spring Boot 4.0虚拟线程实战调优技巧,最大化发挥并发优势
java·人工智能·spring boot·后端·python
不知名的老吴11 分钟前
Redis的延迟瓶颈:TCP栈开销无法避免
数据库·redis·缓存
YOU OU11 分钟前
三大范式和E-R图
数据库
一江寒逸22 分钟前
零基础从入门到精通MySQL(上篇):筑基篇——吃透核心概念与基础操作,打通SQL入门第一关
数据库·sql·mysql
@土豆24 分钟前
Ubuntu 22.04 运行 Filebeat 7.11.2 崩溃问题分析及解决文档
linux·数据库·ubuntu
知行合一。。。29 分钟前
Python--04--数据容器(集合)
python
专注API从业者36 分钟前
淘宝商品详情 API 与爬虫技术的边界:合法接入与反爬策略的技术博弈
大数据·数据结构·数据库·爬虫