分組查詢,字段屬性,字段類型,斷開單對單,多對多的級聯關系
阿新 • • 發佈:2019-03-08
自動創建 mef bigint 字段類型 con book art -- 界面
分組查詢
#整張表作為分組的依據的聚合函數使用 只輸出聚合函數結果
# 語法:
# aggregate(別名=聚合函數(‘字段‘))
#
# # 規則:
# 1.可以同時對多個字段進行聚合處理:aggregate(別名1=聚合函數1(‘字段1‘), ..., 別名n=聚合函數n(‘字段n‘))
# 3.是QuerySet對象方法
# 2.方法返回值返回值為dict類型
# Book.objects.all().aggregate(Max(‘price‘))
#
# values裏面放入分組依據相當於group by annotate裏面放聚合函數,後面可以再跟filter相當於having
# 跟上values相當於limited,values裏面不是分組依據後者聚合函數的話默認丟到分組依據裏面去# Publish.objects.all().values(‘name‘).
# annotate(max_price=Max(‘book__price‘)).filter(max_price__startswith=‘6‘).values(‘max_price‘,‘name‘)
## 語法:
# values(‘分組字段‘).annotate(別名=聚合函數(‘字段‘)).filter(聚合字段別名條件).values(‘取分組字段‘, ‘取聚合字段別名‘)
#
# # 規則:
# 1.values(...).annotate(...)為分組組合,values控制分組字段,annotate控制聚合字段# 2.values可按多個字段分組values(‘分組字段1‘, ..., ‘分組字段n‘),??如果省略代表按操作表的主鍵分組
# 3.可以同時對多個字段進行聚合處理annotate(別名1=聚合函數1(‘字段1‘), ..., 別名n=聚合函數n(‘字段n‘))
# 4.分組後的的filter代表having判斷,只對聚合字段進行條件判斷,可以省略(對非聚合字段或分組字段進行條件判斷代表where判斷)
# 5.取字段值values(...)省略默認取所有分組字段與聚合字段,也可以自主取個別分組字段及聚合字段(取字段的values中出現了非分組或非聚合字段,該字段自動成為分組字段)
# # 、
## 七、常用共有字段屬性
# ```python
# ‘‘‘
# 1. null:默認為False,True表示字段可為null
# 2. blank:默認為False,True表示字段可為空
# 3. choice:可選的,限制了該選項的字段值必須是所指定的choice中的一個:
# -- sex = models.SmallIntegerField(choices=((1, ‘男‘), (2, "女")))
# -- obj.get_sex_display()
# 4. db_column:自定義字段名
# 5. db_index:如果為True的話,設置索引
# 6. default:字段默認值
# 7. editable:默認為True,若為False,則不會在/admin/界面顯示
# 8. primary_key:若設置為True,則表示將該字段設置為主鍵。一般情況下django默認會設置一個自增長的id主鍵。
# 9. unique:若設置為True,該字段值不可重復
# ‘‘‘
# ```字段屬性
# null默認為False如果為True表示字段可以為null
# blank默認為False為True的話可以為空
# choice 可選的 限制輸入為設置可選中的一個 元祖套元祖
# sex = models.SmallIntegerField(choices=((1, ‘男‘), (2, "女")))
# 只能選擇輸入1,2取出時如果是 obj.get_sex_display()取出的是裏面對應的值
# db_column 自定義字段名
# db_index:如果為True的話,設置索引
# 6. default:字段默認值
# 7. editable:默認為True,若為False,則不會在/admin/界面顯示
# 8. primary_key:若設置為True,則表示將該字段設置為主鍵。一般情況下django默認會設置一個自增長的id主鍵。
# 9. unique:若設置為True,該字段值不可重復
# ‘常用類型
# 1. AutoField():默認自增主鍵(primary_key=True),django會默認建立id字段主鍵
# 2. BooleanField():布爾字段,對應數據庫tinyint類型
# 3. CharField():字符類型
# -- 字段屬性max_length=64,數據長度,必須明確
# 4. DateField():年月日時間類型
# -- 字段屬性auto_now=True,數據被更新就會更新時間
# -- 字段屬性auto_now_add=True,數據第一次參數時產生
# 5. DateTimeField():年月日小時分鐘秒時間類型
# -- 字段屬性auto_now=True,數據被更新就會更新時間
# -- 字段屬性auto_now_add=True,數據第一次參數時產生
# 6. DecimalField():混合精度的小數類型
# -- 字段屬性max_digits=3,限定數字的最大位數(包含小數位)
# -- 字段屬性decimal_places=2,限制小數的最大位數
# 7. IntegerField():整型
# 不常用的類型
# ‘‘‘
# # 1. BigAutoField():大整型自增
# # 2. BigIntegerField():長整型
# # 3. EmailField():郵箱字段,擁有/admin/驗證
# # 4. FloatField():浮點型小數
# # 5. SmallIntegerField():小整型
# # 6. TextField():大文本類型
# # 7. FileField():文件字段
# 1. ForeignKey():外鍵字段
# -- 字段屬性to關聯模型類
# -- 字段屬性to_field關聯字段,省略默認關聯主鍵
# -- 字段屬性on_delete (外鍵關聯數據被刪除時的操作)
# -- models.CASCADE 級聯刪除
# -- modles.PROTECT 拋出異常
# -- models.SET_NULL 設置空值
# -- models.SET_DEFAULT 設置默認值
# -- models.SET(value)自定義值
# -- 字段屬性related_name自定義反向查詢的字段名
# -- 字段屬性db_constraint=False取消關聯關系,但還可以使用連表查詢
# 總結:models.ForeignKey(to=‘關聯的類名‘, null=True, on_delete=models.SET_NULL, db_constraint=False, related_name="本類名小寫")
# 2、OneToOneField():一對一外鍵字段
# -- 字段同外鍵
# 3、ManyToManyField():多對多關系字段
# -- 字段屬性to關聯模型類
# -- 字段屬性through關聯關系類
# -- 字段屬性through_fields關聯關系表中(本身類名小寫字段, 關聯表類名小寫字段)
# ‘‘‘
# ```/
#
## 十一、斷開外鍵關聯的ForeignKey使用
#
# ```python
# ‘‘‘
# # 1、不使用ForeignKey方式斷開關聯,不再支持Django ORM連表查詢語法
# class Publish(models.Model):
# name = models.CharField(max_length=20)
# class Book(models.Model):
# name = models.CharField(max_length=20)
# # 字段需要寫_id來表示相關表的字段信息
# publish_id = models.IntegerField()
#
# # *****
# # 2、使用ForeignKey方式用db_constraint=False字段屬性斷開關聯,依然支持Django ORM連表查詢語法,建議使用
# class Publish(models.Model):
# name = models.CharField(max_length=20)
# class Book(models.Model):
# name = models.CharField(max_length=20)
# # 字段不需要寫_id來表示相關表的字段信息,ORM會自動添加
# publish = models.ForeignKey(to=‘Publish‘, null=True, on_delete=models.SET_NULL, db_constraint=False)
#
# ‘‘‘
# 多對多的使用
# 推薦
# class Book(models.Model):
# name=CharField()
# price=InterField()
# author=models.ManyToManyField(to=‘Author‘,
# through=‘Book_Author‘, through_fields=(‘book_id‘, ‘author_id‘), db_constraint=False)
# class Author(models.Model):
# name=CharField()
# class Book_Author(models.Model)
# book_id=models.InterField()
# author_id=models.InterField()
# 可以手動創建關系表,用ManyToManyField方式支持正向反向ORM連表查詢,需要用db_constraint=False斷開關聯
# 自動創建
# 使用ManyToManyField方式用db_constraint=False字段屬性斷開關聯,依然支持Django ORM連表查詢語法,建議使用
# class MyBook(models.Model):
# name = models.CharField(max_length=20)
# my_author = models.ManyToManyField(to=‘MyAuthor‘, db_constraint=False)
# class MyAuthor(models.Model):
# name = models.CharField(max_length=20)
# 1、和自動建立關系表類似,依然支持Django ORM連表查詢語法(多對多借助關系表連表查詢),因為多跨一張表查詢復雜
# class Book(models.Model):
# name = models.CharField(max_length=20)
#
#
# class Author(models.Model):
# name = models.CharField(max_length=20)
#
#
# class Book_Author(models.Model):
# book = models.ForeignKey(to="Book", null=True, on_delete=models.SET_NULL, db_constraint=False)
# author = models.ForeignKey(to=‘Author‘, null=True, on_delete=models.SET_NULL, db_constraint=False)
# time = models.DateField()
# 3、手動創建關系表,在關系表中用ForeignKey方式支持基於外鍵關系表的ORM連表查詢,
# 同時明確ManyToManyField字段,所以也支持ORM正向方向連表查詢
# -- db_constraint = False斷開關聯可以在ForeignKey或ManyToManyField任意一方完成
#
#
# class Book(models.Model):
# name = models.CharField(max_length=20)
# # 明確through與through_fields,ManyToManyField才不會自動建立關系表
# author = models.ManyToManyField(to=‘Author‘, through=‘Book_Author‘, through_fields=(‘book_id‘, ‘author_id‘),
# db_constraint=False)
#
#
# class Author(models.Model):
# name = models.CharField(max_length=20)
#
#
# class Book_Author(models.Model):
# book = models.ForeignKey(to="Book", null=True, on_delete=models.SET_NULL, db_constraint=False)
# author = models.ForeignKey(to=‘Author‘, null=True, on_delete=models.SET_NULL, db_constraint=False)
# time = models.DateField()
#
#
# ‘‘‘
# # 總結:手動創建第三張表,第三張表的增刪改就采用關系表類名衍生的create|delete|update,就不再擁有add|clear|remove|set(因為關系表擁有自己的字段,這些方法無法直接操作這些字段)
分組查詢,字段屬性,字段類型,斷開單對單,多對多的級聯關系