1. 程式人生 > >python---django中orm的使用(4)字段,參數(on_delete重點)補充

python---django中orm的使用(4)字段,參數(on_delete重點)補充

protect 設置 lean 速度 str through 存在 也會 ren

1.索引:

普通索引:加快查找速度

唯一索引:加快查找速度,唯一約束

主鍵索引:加快查找速度,唯一索引,不為空

class UserInfo(models.Model):

    username = models.CharField(
        null=False,     #不允許為空
        db_column=‘user‘,   #自定義列名,可以修改再數據庫中的列名
        max_length=32,
        db_index=True,  #普通索引,只能加速查找
        # unique=True,    #約束索引,加速查找,唯一約束
        # primary
=True, #主鍵索引,加速查找,唯一約束,不為空 )
    gender = models.BooleanField(
        default=True    #設置默認值
    )

元類使用:

用於生成聯合索引,以及設置個別參數

    #元類信息
    class Meta:
        # 數據庫中生成的表名稱 默認 app名稱 + 下劃線 + 類名
        db_table = "app01_un"
        # 聯合索引
        # index_together = [
        #     ("username", "
gender"), # ] # 聯合唯一索引 unique_together = (("username", "gender"),) #IntegrityError: columns user, gender are not unique # admin中顯示的表名稱 verbose_name = "用戶信息"

一對多外鍵建立:

    el = models.ForeignKey(
        to="EmailInfo", #關聯表
        to_field=id,  #關聯列名
db_constraint=True #是否在數據庫該表中創建外鍵約束(外鍵功能查找等依舊存在,但是不具有約束功能)
     limit_choices_to=None, #在Admin或者ModelForm中顯示數據時,提供限制後的數據展示
          --limit_choices_to={‘id_gt‘:5}
          --limit_choices_to=lambda:{‘id_gt‘:5}#或者lambda表達式 )
技術分享圖片
class EmailInfo(models.Model):
    email = models.EmailField(
        null=False,
        db_index=True,
        unique=True,
    )
外鍵關聯表EmailInfo

添加信息:

    #添加信息
    UserInfo.objects.create(
        username="張三",
        gender=True,
        el_id=1
    )
    UserInfo.objects.create(
        username="李四",
        gender=True,
        el_id=2
    )
  #因為唯一約束,是對姓名,性別一起約束,所以當不同時,是可以進行添加的 UserInfo.objects.create( username
="王五", gender=False, el_id=3 ) UserInfo.objects.create( username="王五", gender=True, el_id=3 ) UserInfo.objects.create( username="趙六", gender=True, el_id=4 ) EmailInfo.objects.create(**{email: [email protected]}) EmailInfo.objects.create(**{email: [email protected]}) EmailInfo.objects.create(**{email: [email protected]})

對於外鍵,刪除是是默認為級聯刪除,當刪除一個,對應相關數據也會被刪除,所以,我們有時候需要修改這一性質,在創建外鍵是使用on_delete即可

對於on_delete的幾種設置:

def set_test():
    return 4
    el = models.ForeignKey(
        to="EmailInfo", #關聯表
        to_field=id,  #關聯列名
        null=True,
        default=2,
        #刪除自己數據,對於被關聯方,一點影響都沒有

        #on_delete=None, #當關聯的email數據被刪除時候,該數據也會被刪除,不存在
        #on_delete=models.CASCADE, #性質和None一樣是默認刪除
#on_delete
=models.DO_NOTHING, #當關聯的數據被刪除時,自己不受影響,什麽事都不做,不會報錯
#on_delete
=models.PROTECT, #關聯保護,因為郵箱數據被用戶表關聯,所以該郵箱不允許被刪除,並且觸發ProtectError #Cannot delete some instances of model EmailInfo because they are referenced through a protected foreign key: UserInfo.el‘", <QuerySet [<UserInfo: UserInfo object>]>
#on_delete=models.SET_NULL, #刪除關聯數據,自己被設置為null(前提字段需要設置為可空null=True) #對於測試models.SET_NULL時,我們需要先了解,對於數據庫的基本字段設置,像null,max_length這些屬性,我們需要重新去生成數據表, #對於on_delete等Django中的附屬屬性,我們可以動態修改,不需要重新生成數據表,所以如果我們開始並沒有設置null=True(默認false),我們需要去重新生成數據表 #on_delete=models.SET_DEFAULT,#刪除關聯數據後,會將自己的數據設置為默認值,需要設置default屬性
#on_delete
=models.SET(3) #和SET_DEFAULT相似,只不過不需要設置默認值,在SET()中可以直接設置 on_delete=models.SET(set_test) #和SET一樣,只不過值設為了回調函數,需要將函數設為全局,可調用 )

python---django中orm的使用(4)字段,參數(on_delete重點)補充