Django(数据库操作)

本文详细介绍Django框架中ORM的操作方法,包括单表、一对多及多对多关系的数据表创建、增删改查等核心操作,并提供具体实例。

在django中,数据库的创建一般是在models.py中完成

一.单表操作(在表的创建过程中,不能同时对表进行增删等操作,要等表创建完再执行相关操作)

1.创建表

class AuthorDetail(models.Model):
    sex = models.BooleanField(max_length=1, choices=((0, ''),(1, ''),))
    email = models.EmailField()
    address = models.CharField(max_length=50)
    birthday = models.DateField()
    author = models.OneToOneField(Author)

#声明一个类AuthorDetail,表名就是类名的小写。sex,email等是字段名
在class声明完之后,在命令行中输入:1.python manage.py makemigrations 2.python manage.py migrate 然后点击view-toolwindow-database,将db.sqlite3拖入右边窗口
生成如图所示表


 2.增(create)(暂且不会同时添加多条数据,要一条一条添加)

#create方式一:   Author.objects.create(name='Alvin')               #Author是类名,也是表名

    #create方式二:   Author.objects.create(**{"name":"alex"})      #create()参数如果是字典,前面**,如果是列表,前面*。

    #save方式一:     author=Author(name="alvin")
                    author.save()

    #save方式二:     author=Author()
                    author.name="alvin"
                    author.save()

3.删(delete)

Book.objects.filter(id=1).delete()    #filter是遍历,找到id为1的行并删除

4.改(update和save)

models.Book.objects.filter(id=3).update(title="PHP")  #只能用filter,不能用get

obj=models.Book.objects.get(id=3) #此处只能用get,不然无法调用save方法 obj.title="Python" obj.save()

5.查

#  <1>filter(**kwargs):      它包含了与所给筛选条件相匹配的对象

#  <2>all():                 查询所有结果

 

 

二.一对多操作

1.表的创建

#创建两张表Author/Book
#在Author表中添加外键,外键是在多的表中添加的(一本书可以由多个作者书写)。
class Author(models.Model):
    name=models.CharField(max_length=50)
    book=models.ForeignKey("Book",on_delete=models.CASCADE)    #Book表在Author表下创建,要写成"Book"。这句话的意思:book_id字段(自动生成)绑定Book表中的id
class Book(models.Model):
    address=models.CharField(max_length=50)

 

2.增

# # Author.objects.create(name="ww1",book_id=4)        #book_id=4也就是找Book表中id=4的行(首先Book中得要有id=4的值)
# # Book.objects.create(address="cha")                 #必须是这句代码执行完才能执行上面一行代码

 

 

3.查

 

 class Author(models.Model):

  name=models.CharField(max_length=29)

  book=models.ForeignKey(to="Book")

 class Book(models.Model):

  address=models.CharField(max_length=20)




#正向查询(由book_id所在表查询另一张表)

autor=Author.objects.get(id=4) #从Author表中得到id=4的一行,用变量autor存储 print(autor.book_id) #得到变量autor的book_id #book_id=2 print(autor.book.address) #这个book是Author表中的book 通过autor.book.address获取Book表中的字段


#反向查询()
cls=Book.objects.get(id=1) #Book表中id=1的在Author表中对应id=1,2的两行
cls.author_set.all()

 

三.多对多

1.表的创建

#一个学生可以在多个班级上课,一个班级可以有多个学生
class Stuent(models.Model):
    name=models.CharField(max_length=50) 
    clas=models.ManyToManyField("Class")         #自动创建一个新表(中间表)
class Class(models.Model):
    name=models.CharField(max_length=50)

以上定义了两个类,明面上是创建了两个新表,实际上是创建了三个表(因为有ManyToManyFiled)

 

 

对待自动创建的表无法直接对第三张表操作
obj = Student.objects.get(id=1)
obj.name
# 对第三张表操作
#添加
obj.clas.add(1)  #对第三张表添加student_id=1,class_id=1
obj.clas.add(2,3)    #对第三张表添加student_id=1,class_id=2;student_id=1,class_id=3
obj.clas.add(*[1,2,3])  #对第三张表添加student_id=1,class_id=1;student_id=1,class_id=2;student_id=1,class_id=3
#删除
obj.clas.remove(1)     
obj.clas.remove(2,3)    
obj.clas.remove(*[1,2,3]) 

obj.clas.clear()    

#更新
obj.name = 'new_name'
obj.save()
obj.clas.set([1,2,3])    

#查询
obj.stu.all() #这是对另一张表的所有遍历
for i in obj.stu.all():
  print(i.name)
  #print(i.value("name"))

 

 

 

 表的创建方式二(自己创建第三张表)

class Stuent(models.Model):
    name=models.CharField(max_length=50) 
class Class(models.Model):
    name=models.CharField(max_length=50)
class Student_Class(models.Model):
  s=models.ForeignKey(Student) #s在表中自我生成s_id,和Student表中的id绑定
  c=models.ForeignKey(Class) #c在表中自我生成c_id,和Student表中的id绑定


对其操作就如同一对多中操作





class UserInfo(models.Model): # 用户信息表
  username = models.CharField(max_length=32) # 用户名
  phone = models.CharField(max_length=22) # 手机号
  password = models.CharField(max_length=32) # 密码
  def __str__(self):
    return self.phone+self.password

 

如果 models.UserInfo.objects.all()    //查询到的就是__str__返回的内容

 

 多对多操作:https://blog.youkuaiyun.com/shangliuyan/article/details/7920037  

转载于:https://www.cnblogs.com/gaoyukun/p/9028546.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值