1. 程式人生 > >Django-model基礎

Django-model基礎

robot 實例 hid tail none 兩個 手機 ddr 修改

一、OPM

映射關系:

     表名  <-------> 類名

       字段  <-------> 屬性

    表記錄 <------->類實例對象

二、創建表(建立模型)

實例:我們來假定下面這些概念,字段和關系

作者模型:一個作者有姓名和年齡。

作者詳細模型:把作者的詳情放到詳情表,包含生日,手機號,家庭住址等信息。作者詳情模型和作者模型之間是一對一的關系(one-to-one)

出版商模型:出版商有名稱,所在城市以及email。

書籍模型: 書籍有書名和出版日期,一本書可能會有多個作者,一個作者也可以寫多本書,所以作者和書籍的關系就是多對多的關聯關系(many-to-many);一本書只應該由一個出版商出版,所以出版商和書籍是一對多關聯關系(one-to-many)。

技術分享
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")
 
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) keepNum=models.IntegerField()<br> commentNum=models.IntegerField() # 與Publish建立一對多的關系,外鍵字段建立在多的一方 publish=models.ForeignKey(to="Publish",to_field="nid") # 與Author表建立多對多的關系,ManyToManyField可以建在兩個模型中的任意一個,自動創建第三張表 authors=models.ManyToManyField(to=Author)
設計表

三、表記錄操作

(1)單表記錄的操作:

1 添加
   #方式1:
   obj=models.表名(**kwargs)
   obj.save()
  
   #方式2:
   models.表名.objects.create(**kwargs)

2 修改:
  #方式1:
  obj=models.表名.objects.fllter(name="python")[0]    
  obj.name="Java"
  obj.save

  # 方式2  update
  models.表名.objects.fllter(name="python").update(**kwargs)


3 刪除:
   models.表名.objects.fllter(name="python").delete()

4 查詢:
   models.表名.objects.all()    # QuerySet集合對象 [obj1,obj2,...]
   models.表名.objects.filter(**kwargs)    # QuerySet集合對象 
   models.表名.objects.get(**kwargs)      # model對象
   models.表名.objects.all().values(*arg)     # QuerySet集合對象[{"":""},{"":""}]
    models.表名.objects.all().values_list(*arg) # QuerySet集合對象[(),()]

   models.表名.objects.exclude(**kwargs) # QuerySet集合對象 
   models.表名.objects.order_by(*arg) # QuerySet集合對象 
   models.表名.objects.distinct(*arg) # QuerySet集合對象 
   models.表名.objects.filter(**kwargs).first() # model對象 
   models.表名.objects.filter(**kwargs).last() # model對象 
   models.表名.objects.filter(**kwargs).count() # 整形數字

   models.表名.objects.filter(**kwargs).exist() # True 或者false
技術分享
# jquery的鏈式操作    
$(this).css("color","red")    
$(this).next().css("fontSize","30px")    

$(this).css("color","red").next().css("fontSize","30px")    


了不起的雙下劃線:
models.表名.objects.filter(id__gt=10)
models.表名.objects.filter(title__startswith="py")
models.Tb1.objects.filter(id__range=[1, 2]) 
models.Tb1.objects.filter(id__in=[11, 22, 33])

 
擴展

(2)關聯表記錄操作:

添加記錄:

一對多:
      創建一對多:
      publish=models.ForeignKey("Publish",related_name="bookList")
      #添加記錄方式1:
      models.Book.objects.create(publish_id=1)
      #添加記錄方式2:
      #pubObj=models.Publish.objects.filter(name="人民出版社")[0]
·     #models.Book.objects.create(publish=pubObj) # 關聯的出版社對象

多對多:
     創建多對多關系:
     authorlist=models.ManyToManyField("Author",related_name="bookList")
     多對多添加記錄:
     book_obj=models.Book.objects.create(title="追風箏的人", price=100, publishDate="2017-12-12", publish_id=2)
     alex_obj=models.Author.objects.filter(name="alex")[0]
     egon_obj=models.Author.objects.filter(name="egon")[0]

     book_obj.authorlist.add(alex_obj,egon_obj)


查詢記錄:

正向查詢:
一對多: linux_obj
=models.Book.objects.filter(title="linux").first() print(linux_obj.publish.name) # 與這本書對象關聯的出版社對象的名字 多對多: linux_obj=models.Book.objects.filter(title="linux").first() print(linux_obj.authorlist.all()) # 與這本書關聯的所有作者對象集合

反向查詢: #一對多的反向查詢: eg:人民出版社出版過的書籍的名字 publish_obj=models.Publish.objects.filter(name="人民出版社")[0] print(publish_obj.bookList.all()) # 與該年出版社關聯的所有書籍對象的集合 #多對多的反向查詢: 查詢yuan出版過的所有書籍的名字和價格: author_yuan=models.Author.objects.get(name="yuan") print(author_yuan.bookList.all()) # 與該作者關聯的所有書籍書籍對象的集合
models.Book.objects.filter(**kwargs): querySet [obj1,obj2]
models.Book.objects.filter(**kwargs).values(**kwargs) : querySet [{},{},{}]
models.Book.objects.filter(**kwargs).values_list(title) : querySet [(),(),()]


(3)跨表查詢:

技術分享
class Book(models.Model):
        title = models.CharField(max_length=32)

        publish=models.ForeignKey("Publish") # 創建一對多的外鍵字段
        authorList=models.ManyToManyField("Author") # 多對多的關系,自動創建關系表

class Publish(models.Model):
        name = models.CharField(max_length=32)
        addr = models.CharField(max_length=32)

class Author(models.Model):
        name=models.CharField(max_length=32)
        age=models.IntegerField()

        ad=models.models.OneToOneField("AuthorDetail")

class AuthorDetail(models.Model):
        tel=models.IntegerField()
表創建

2、基於對象關聯查詢:
一對多查詢(Book--Publish):

正向查詢,按字段:
book_obj.publish : 與這本書關聯的出版社對象 book_obj.publish.addr: 與這本書關聯的出版社的地址

反向查詢,按表名_set
publish_obj.book_set: 與這個出版社關聯的書籍對象集合    publish_obj.book_set.all() :[obj1,obj2,....]    

一對一查詢(Author---AuthorDetail):

正向查詢,按字段:
author_obj.ad : 與這個作者關聯的作者詳細信息對象

反向查詢:按表名:
author_detail_obj.author : 與這個作者詳細對象關聯的作者對象

多對多(Book----Author):

正向查詢,按字段: 
book_obj.authorList.all(): 與這本書關聯的所有這作者對象的集合 [obj1,obj2,....]

反向查詢,按表名_set:
author_obj.book_set.all() : 與這個作者關聯的所有書籍對象的集合

3、基於雙下滑線的跨表查詢:

一對多查詢(Book--Publish):

正向查詢,按字段:    
# 查詢linux這本書的出版社的名字:
models.Book.objects.all().filter(title="linux").values("publish__name")

反向查詢:按表名:
# 查詢人民出版社出版過的所有書籍的名字
models.Publish.objects.filter(name="人民出版社出版").values("book__title")

一對一查詢(Author---AuthorDetail):

正向查詢,按字段:
models.Author.objects.filter(name="egon).values("ad__tel")

反向查詢:按表名:
models.AuthorDetail.objects.filter(tel="151").values("author__name")

多對多(Book----Author):

正向查詢,按字段:
models.Book.objects.filter(title="python").values("authorList__name") [{},{},{},{}]

正向查詢,按表名:
models.Author.objects.filter(name="alex").values("book__price")

註意:

publish=models.ForeignKey("Publish",related_name="bookList")
authorlist=models.ManyToManyField("Author",related_name="bookList") 
ad=models.models.OneToOneField("AuthorDetail",related_name="authorInfo")

反向查詢的時候都用:related_name


聚合查詢:

querySet().aggregate(聚合函數)------返回的是一個字典,不再是一個querySet

Book.objects.all().aggregate(average_price=Avg(price))

分組查詢:

querySet().annotate() --- 返回的是querySet

#統計每一個出版社中最便宜的書籍的價格
sql:
select Min(price) from book group by publish_id;

ORM:

models.Book.objects.values("publish__name").annotate(Min("price"))

Django-model基礎