记录操作之增删改查

记录操作之增删改查

一、单表

1、 添加记录

准备表

from django.db import models

class Book(models.Model):
    title = models.CharField(max_length=20)
    price = models.DecimalField(max_digits=65,decimal_places=5)
    publish = models.CharField(max_length=30)
    pub_date = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return "%s:%s:%s" %(self.id,self.title,self.price)

添加记录的两种方式

# 方式一
obj=Book.objects.create(title="葵花宝典",price=100,publish="苹果出版社")

# 方式二:
obj=Book(title="九阴真经",price=100,publish="苹果出版社")
obj.save()

添加n条记录为后续操作做准备

Book.objects.create(title="红龙梦",price=300,publish="66出版社")
Book.objects.create(title="钢弹是怎样炼成的",price=10,publish="新华出版社")
Book.objects.create(title="聊斋",price=50,publish="77出版社")
Book.objects.create(title="老女人与海王",price=30,publish="33出版社")
Book.objects.create(title="西游记",price=43,publish="88出版社")

2、单表查询

查询API

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

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

<3> get(**kwargs):          返回与所给筛选条件相匹配的对象,返回结果有且只有一个,
                            如果符合筛选条件的对象超过一个或者没有都会抛出错误。

<4> exclude(**kwargs):      它包含了与所给筛选条件不匹配的对象

<5> order_by(*field):       对查询结果排序('-id')

<6> reverse():              对且只对order_by排序的结果进行翻转

<8> count():                返回数据库中匹配查询(QuerySet)的对象数量。

<9> first():                返回QuerySet集中的第一个对象  

<10> last():                返回QuerySet集中的最后一个对象 

<11> exists():              如果QuerySet包含数据,就返回True,否则返回False

<12> values(*field):        返回一个ValueQuerySet——一个特殊的QuerySet,运行后得到的并不是一系列
                            model的实例化对象,而是一个可迭代的字典序列

<13> values_list(*field):   它与values()非常相似,但返回的是一个元组序列

<14> distinct():            从返回结果中剔除重复纪录

示例

# QuerySet数据类型(类似于一个列表,里面放着一些对象)
# 1 方法的返回值是什么
# 2 方法的调用者

===============调用者为管理器,返回值为一个记录对象=========
obj = Book.objects.get(title="聊斋")
print(obj)  # 结果为:Book object (5)
print(obj.title)
# 若找不到符合条件的记录则报错
Book.objects.get(title="跟Egon学养猪小妙招")  # 报错

===============调用者为管理器,返回值为QuerySet=========
# 1、all:
book_list = Book.objects.all()
print(book_list)  # 结果是一个QuerySet
print(book_list[0].title)
for obj in book_list:
    print(obj.title)

# 2、filter
book_list = Book.objects.filter(title="聊斋")  # 相当于where,还可以使用基于双下划线的模糊查询

# 3、exclude
book_list = Book.objects.exclude(title="聊斋")  # 除了title="聊斋"之外的都留下来

===============调用者为QuerySet,返回值。。。=========
# 1、count(): 返回的是整型
n = Book.objects.all().count()
print(n)  # 7

# 2、first():返回的是一个记录对象             
obj = Book.objects.all().first()
print(obj)  
print(obj.id)  # 1

# 3、last():返回的是一个记录对象     
obj = Book.objects.all().last()
print(obj)  
print(obj.id)  # 7

# 4、exists():返回的是布尔值
res = Book.objects.filter(title="跟Egon老师学算命").exists()
print(res)  # False

# 5、order_by(*field):返回的同样是QuerySet
objs = Book.objects.filter(id__lte=6)
print(objs)  # QuerySet
print(objs.order_by('price','-id'))  # 先按照price字段升序排,若price相同则按照id字段降序排

# 6、reverse():返回的同样是QuerySet    
objs = Book.objects.all()

无效
print([obj.id for obj in objs])
print([obj.id for obj in objs.reverse()])  # 顺序与上面保持一致

有效
print([obj.id for obj in objs.order_by('-id')])
print([obj.id for obj in objs.order_by('-id').reverse()])  # 顺序在上面的排序的基础上翻转

# 7、values(*field): 返回的同样是QuerySet
objs = Book.objects.filter(id__gte=3)
print(objs.values("title"))  # 返回一个QuerySet
print(objs.values("title")[0]['title'])  # 红龙梦
print(objs.values("title").last()['title'])  # 西游记

# 8、values_list(*field): 返回的同样是QuerySet 
objs = Book.objects.filter(id__gte=3)
print(objs.values_list("title"))
print(objs.values_list("title")[0][0])  # 红龙梦
print(objs.values_list("title").last()[0])  # 西游记

# 9、distinct(): 返回的同样是QuerySet
Book.objects.all().distinct()  # 该行代码无意义,因为每一条结果多不是重复的

正确用法如下
objs = Book.objects.all().values("price").distinct()
print(objs)

基于双下划线的模糊查询

Book.objects.filter(price__in=[100,200,300])
Book.objects.filter(price__gt=100)
Book.objects.filter(price__lt=100)
Book.objects.filter(price__gte=100)
Book.objects.filter(price__lte=100)

# 等同于Book.objects.filter(id__gte=100,id__lte=200)
# 相当于where price between 100 and 200
Book.objects.filter(price__range=[100,200])  

Book.objects.filter(title__contains="python")
Book.objects.filter(title__icontains="python")  # 忽略大小写
Book.objects.filter(title__startswith="py")
Book.objects.filter(title__iendswith="py")

Book.objects.filter(pub_date__lte="2021-02-23 17:51:00")
Book.objects.filter(pub_date__minute="38")

3、单表delete

删除delete:调用者只能是QuerySet或者单个一个记录对象

*# 批量删除
objs = Book.objects.filter(id__in=[1,3,5])
objs.delete()


# 删除单一记录
objs = Book.objects.filter(id=6)
obj=objs[0]
obj.delete()

*objs.last().delete()

在 Django 删除对象时,会模仿 SQL 约束 ON DELETE CASCADE 的行为,换句话说,删除一个对象时也会删除与它相关联的外键对象。例如:

b = Blog.objects.get(pk=1)
# This will delete the Blog and all of its Entry objects.
b.delete()

要注意的是: delete() 方法是 QuerySet 上的方法,但并不适用于 Manager 本身。这是一种保护机制,是为了避免意外地调用 Entry.objects.delete() 方法导致 所有的 记录被误删除。如果你确认要删除所有的对象,那么你必须显式地调用:

Entry.objects.all().delete() 

如果不想级联删除,可以设置为:

pubHouse = models.ForeignKey(to=’Publisher’, on_delete=models.SET_NULL, blank=True, null=True)

4、单表update

修改update:调用者只能是QuerySet,返回值为int

objs = Book.objects.filter(id=7)
rows=objs.update(title="xxx")    
print(rows)

Book.objects.filter(name='跟Egon学算命').first().update(name='大家多能成神仙')  # 报错

update()方法对于任何结果集(QuerySet)均有效,这意味着你可以同时更新多条记录update()方法会返回一个整型数值,表示受影响的记录条数。

二、多表

准备多对多、一对多、一对一关系如下

from django.db import models

class Book(models.Model):
    nid = models.AutoField(primary_key=True)
    name = models.CharField(max_length=32)
    price = models.DecimalField(max_digits=5, decimal_places=2)
    publish_date = models.DateField(auto_now_add=True)
    # 阅读数
    # read_num=models.IntegerField(default=0)
    # 评论数
    # comment_num=models.IntegerField(default=0)

    publish = models.ForeignKey(to='Publish',to_field='nid',on_delete=models.CASCADE)
    authors=models.ManyToManyField(to='Author')
    def __str__(self):
        return self.name

class Author(models.Model):
    nid = models.AutoField(primary_key=True)
    name = models.CharField(max_length=32)
    age = models.IntegerField()
    author_detail = models.OneToOneField(to='AuthorDatail',to_field='nid',unique=True,on_delete=models.CASCADE)

class AuthorDatail(models.Model):
    nid = models.AutoField(primary_key=True)
    telephone = models.BigIntegerField()
    birthday = models.DateField()
    addr = models.CharField(max_length=64)

class Publish(models.Model):
    nid = models.AutoField(primary_key=True)
    name = models.CharField(max_length=32)
    city = models.CharField(max_length=32)
    email = models.EmailField()

生成的表如下:

1、添加记录

111

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇

You cannot copy content of this page