ORM操作

Posted regit

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ORM操作相关的知识,希望对你有一定的参考价值。

 

model如下

class Publisher(models.Model):
    name = models.CharField(max_length=30)
    address = models.CharField(max_length=50)
    website = models.URLField()


class Author(models.Model):
    name = models.CharField(max_length=30)


class AuthorDetail(models.Model):
    GENDER_CHOICE = (
        (0, ""),
        (1, ""),
    )
    sex = models.BooleanField(max_length=1, choices=GENDER_CHOICE)
    email = models.EmailField()
    birthday = models.DateField()
    author = models.OneToOneField(Author, on_delete=models.CASCADE)


class Book(models.Model):
    title = models.CharField(max_length=100)
    authors = models.ManyToManyField(Author)
    publisher = models.ForeignKey(Publisher, on_delete=models.CASCADE)
    publication_date = models.DateField()

 

  

 

ORM常见操作
 
首先进入shell界面,python manage.py shell
 
1. 增加,有两种方法:即create和save方法
 
1)增加一个作者记录
from hello.models import *
Author.objects.create(name="lilei")
AuthorDetail.objects.create(sex=False,email=13@qq.com, birthday="1989-08-20", author_id=1)
注意最后的author_id=1, 其中author_id是authordetail表中自动生成的字段名,1的值是通过在Author表中插入作者记录后自动生成的id号。
>>> Author.objects.all().values("id", name)
<QuerySet [{id: 1, name: lilei}, {id: 2, name: jack}]>
外键的插入方式有两种
1)通过id的方式,这里就是通过id方式;
2)通过对象的方式,在下面的例子中会说明
 
 
2)增加一个出版社
pub = Publisher()
pub.name = ‘电子工业出版社‘
pub.address = ‘华阳‘
pub.save()
 
3)增加一个书籍,这里可以分两步做
Book.objects.create(title=‘小王子‘, publisher=pub, publication_date=‘2009-05-06‘)  #对象的方式
或者
Book.objects.create(title="小王子", publisher_id=2, publication_date="2009-08-12")  #id的方式
 
还要增加作者的字段,作者和书籍是多对多关系
book=Book.objects.get(id=1)   #首先根据书籍id号得到书籍的对象
author = Author.object.get(id=1)  #再根据作者id号得到作者的对象
book.authors.add(author)  
 
小结:
1)objects是model默认管理器,它提供一系列方法来管理数据,比如create()方法
2)插入主外键关系的时候,可以用对象的方式,也可直接用关联id的方式
3)插入多对多关系的时候要分步操作
4)save()是实例化对象的方法
 
 
 
2. 修改,可用update()和save()
实例
1)修改id为1的作者的名字为jack,性别为女
author=Author.objects.get(id=1)
author.name=‘jack‘
author.save()
 
2)修改名为"电子工业出版社"的出版社地址为中和,城市为成都
Publisher.objects.filter(id=1).update(city=‘成都‘, address=‘中和‘) 
注意:
update是QuerySet对象的方法,而filter()的返回类型为QuerySet
 
 
 
3. 查询
1)查询所有出版社信息
Publisher.objects.all()
 
可用type(Publlisher.objects.all())查看返回类型
 
注意:
1)ORM中的查询是惰性查询,比如Publisher.objects.all()只是返回了一个QuerySet(查询结果集对象),并不会马上执行sql,而是调用QuerySet的时候才执行
简单说就是print(Publisher.objects.all())会执行sql,显示出查询结果;不加print()就不执行
2)在django shell中不是惰性查询
 
 
 
4. 删除, delete()
1)删除id为1的书籍信息, 会删除所有表中的书籍信息
Book.objects.filter(id=1).delete()
 
2)删除city为成都的出版社
Publisher.objects.filter(city=‘成都‘).delete()
 
注意:
1)django中的删除默认是级联删除
2)delete方法也是 QuerySet对象的方法
 
 
 
 

以上是关于ORM操作的主要内容,如果未能解决你的问题,请参考以下文章

VSCode自定义代码片段——git命令操作一个完整流程

VSCode自定义代码片段15——git命令操作一个完整流程

VSCode自定义代码片段15——git命令操作一个完整流程

Django之ORM操作

Django---ORM操作大全

Django-ORM操作数据库无数据问题