1. 程式人生 > >ORM回顧 之 單,多表查詢 many2many 中介模型

ORM回顧 之 單,多表查詢 many2many 中介模型

ron clear ont color queryset 字段 boolean 一對多 sta


python獨立的ORM框架

1 SQLAlchemy


ORM:對象關系映射

模型類 --------- 表
類下的屬性變量 --------- 字段名稱
類下的屬性變量對應的值--------- 字段約束關系
類的實例對象 --------- 表的一條記錄數據


class Book(models.Model):
id=models.AutoField(primary_key=True)
title=models.CharField(max_length=32)


state=models.BooleanField()
pub_date=models.DateField()
price=models.DecimalField(max_digits=8,decimal_places=2)
publish=models.CharField(max_length=32)

一 單表操作
添加記錄:
方式1: book=Book.objects.create()
方式2:
book=Book(title="A")
book.save()

book=Book()
book.title="B"

book.save()

查詢API:
<1> all(): 查詢所有結果

<2> filter(**kwargs): 它包含了與所給篩選條件相匹配的對象

<3> get(**kwargs): 返回與所給篩選條件相匹配的對象,返回結果有且只有一個,
如果符合篩選條件的對象超過一個或者沒有都會拋出錯誤。

<4> exclude(**kwargs): 它包含了與所給篩選條件不匹配的對象

<5> order_by(*field): 對查詢結果排序


<6> reverse(): 對查詢結果反向排序

<8> count(): 返回數據庫中匹配查詢(QuerySet)的對象數量。

<9> first(): 返回第一條記錄

<10> last(): 返回最後一條記錄

<11> exists(): 如果QuerySet包含數據,就返回True,否則返回False

<12> values(*field): 返回一個ValueQuerySet——一個特殊的QuerySet,運行後得到的並不是一系列
model的實例化對象,而是一個可叠代的字典序列
<13> values_list(*field): 它與values()非常相似,它返回的是一個元組序列,values返回的是一個字典序列

<14> distinct(): 從返回結果中剔除重復紀錄


總結:
1 方法是由誰調用,返回值是什麽類型
2 queryset支持鏈式操作
Book.objects.filter().order_by().reverse().count()

3 修改

queryset.update(price=100)
queryset.update(**{"price":100})

4 刪除
queryset.delete()
model_obj.delete()


多表操作

class Author(models.Model):
nid = models.AutoField(primary_key=True)
name=models.CharField( max_length=32)
age=models.IntegerField()

# 與AuthorDetail建立一對一的關系
authorDetail=models.OneToOneField(to="AuthorDetail",on_delete=models.CASCADE)

class AuthorDetail(models.Model):

nid = models.AutoField(primary_key=True)
birthday=models.DateField()
telephone=models.BigIntegerField()
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()


class Book(models.Model):

nid = models.AutoField(primary_key=True)
title = models.CharField( max_length=32)
publishDate=models.DateField()
price=models.DecimalField(max_digits=5,decimal_places=2)

# 與Publish建立一對多的關系,外鍵字段建立在多的一方
publish=models.ForeignKey(to="Publish",to_field="nid",on_delete=models.CASCADE)
# 與Author表建立多對多的關系,ManyToManyField可以建在兩個模型中的任意一個,自動創建第三張表
authors=models.ManyToManyField(to=‘Author‘,)


一 添加記錄:

綁定一對多的關系:

book=Book(title="A",publish_id=1)
book.save()

book=Book(title="A",publish=publish_obj)
book.save()


book=Book()
book.title="B"
book.publish=publish_obj
book.save()


print(book.publish)
print(book.publish_id)

綁定多對多的關系:

book_authors

id book_id author_id
1 1 1
2 1 2
3 1 3
4 1 8

book_obj=Book.objects.get(pk=1)
book_obj.authors.add(1,2,3,4)

author_01=Author.objects.get(pk=1)
book_obj.authors.add(author_01)
book_obj.authors.add(1)

book_obj.authors.add(*[1,2,3,4])
###################################
book_obj=Book.objects.get(pk=1)
book_obj.authors.remove(3)
author_obj=Author.objects.get(pk=3)
book_obj.authors.remove(author_obj)
book_obj.authors.remove(2,3)
book_obj.authors.remove(*[2,3])
###################################
book_obj=Book.objects.get(pk=1)
book_obj.authors.clear()
###################################
book_obj=Book.objects.get(pk=1)
book_obj.authors.set(8)



中介模型:

student
id name
1 alex
2 egon

course
id name
1 人體藝術
2 瑜伽


student_course

id student_id course_id score
1 1 1

class Student():
name=....
courses=models.ManyToManyFiled(to="Course",through="student_course")

class Course():
name=....

class student_course():
id
student_id
course_id
score

中介模型註意點:
add/remove/set

redis:
1 NoSql
2 緩存在內存中
3 支持持久化
4 key-value(value可以是字符串,數字,數組,哈希,集合)



redis:

redis-----> {



}



0010 0000
1010 0101
與運算 0010 0000
或運算 1010 0101
異或運算1000 0101


from django.db import transaction

with transaction.atomic():

artcle_id=artcle_id
ArticleUpDown.objects.create(artcle_id=artcle_id,.......)

Articel.objects.filter(pk=artcle_id).update(up_count=F("up_count")+1)











ORM回顧 之 單,多表查詢 many2many 中介模型