from app01.models import *
#create方式一: Author.objects.create(name='Alvin')
#create方式二(推荐): Author.objects.create(**{"name":"alex"})
#save方式一: author=Author(name="alvin")
author.save()
#save方式二: author=Author()
author.name="alvin"
author.save()
#一对多(ForeignKey):
方式一: 由于绑定一对多的字段,比如publish,存到数据库中的字段名叫publish_id,所以我们可以直接给这个字段设定对应值:
Book.objects.create(title='python',publisher_id=1,publication_date='2022-09-14',price=99)
#publisher_id=1这里的1是指为该book对象绑定了Publisher表中id=2的行对象
方式二:
<1> 先获取要绑定的Publisher对象:
pub_obj=Publisher(name='河大出版社',address='保定',city='保定',state_province='北',country='China',website='http://www.hbu.com')
OR pub_obj=Publisher.objects.get(id=1)
<2>将 publisher_id=2 改为 publisher=pub_obj
#多对多,ManyToMany写在book表中
-----正向查询------
author1=Author.objects.get(id=1)
author2=Author.objects.filter(name='gmm')[0]
book=Book.objects.get(id=1)
book.authors.add(author1,author2)
book.author.remove(author1,author2) #移除
-----反向查询------
author=models.Author.objects.filter(id=1)[0]
books = models.Book.objects.filter(id__gt=1)
author.book_set.add(*books)
author.book_set.remove(*books)
方式一:
publisher=Publisher.objects.get(id =3)
publisher.name = '广东出版社'
publisher.save()
方式二:
Publisher.objects.filter(id =3).update(name='XX出版社')
注意点:
<1> 第二种方式修改不能用get的原因是:update是QuerySet对象的方法,get返回的是一个model对象,它没有update方法,而filter返回的是一个QuerySet对象(filter里面的条件可能有多个条件符合,比如name='alvin',可能有两个name='alvin'的行数据)。
<2>save()方法,这个方法会更新一行里的所有列。 而某些情况下,我们只需要更新行里的某几列。
>>> Book.objects.filter(id=4).delete()
(2, {'blog.Book_authors': 1, 'blog.Book': 1})
我们表面上删除了一条信息,实际却删除了二条,因为我们删除的这本书在Book_authors表中有一条相关信息,这种删除方式就是django默认的级联删除。
由https://www.cnblogs.com/xwltest/p/16694602.html可知,on_delete用于设置删除模式,不同的删除模式会影响数据删除的结果,说明如下:
CASCADE:表示级联操作,就是说,如果主键表中被参考字段更新,外键表中也更新,主键表中的记录被删除,外键表中改行也相应删除;
PROTECT:如果删除的数据设有外键字段并且关联其它数据表的数据,就提示删除失败;
SET_NULL:执行数据删除并且其它数据表的外键字段设为NULL,外键字段必须将属性设为:True,否则提示异常;
SET_DEFAULT:执行数据删除并且其它数据表的外键字段设为默认值;
SET:执行数据删除并且其它数据表的外键字段关联其它数据;
DO_NOTHING:不做任何处理。