1. 程式人生 > >Django之模型層,單,多表操作(一)

Django之模型層,單,多表操作(一)

一:資料庫型別

  資料庫主要分成兩類,關係型資料庫和非關係型資料庫,具體區別可參照部落格地址,https://blog.csdn.net/u012965373/article/details/51779361。以下個人簡單理解

  1:關係型資料庫:

    ORM 物件關係型對映。用物件的方式儲存資料庫的資料。

      表名 物件名       表字段 物件屬性       表資料 一個例項化物件

  2:非關係型資料庫

    NoSQL = Not Only SQL        redis就是一種非關係型資料庫,通過key-value的方式進行儲存。

二:Django建立表關係  

  2.1 : python manage.py makemigrations 建立表之間的關係   2.2: python mangae.py migrate 建立表

三:setting資料庫配置

  3.1: django在setting預設使用內建sqlite資料庫

    

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, '
db.sqlite3'), } }

  3.2:django配置mysql資料庫

  

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',  # 驅動器
        'NAME': 'blog',                        #資料庫名
        'USER':'root',                         #使用者名稱 
        'PASSWORD':'root1234',                 #
密碼 'HOST':'', # 計算機IP地址,空地址預設本機地址 'PORT':3306, # 埠號 } }

 

四:Django表關係

     4.1:一對一關係:    

class  UserInfo(AbstractUser):
    nid = models.AutoField(primary_key=True)
    telephone=models.CharField(max_length=11,null=True,unique=True)
    avatar=models.FileField(upload_to='avatar/',default="")#upload_to 代表著檔案上傳到伺服器的位置 預設跟目錄。可以通過設定media
    blog=models.OneToOneField(to='Bolg',to_field='nid',null=True,on_delete=None) # 建立一對一的關係
    def  __str__(self):
        return  self.username
#部落格表
class  Bolg(models.Model):
    nid=models.AutoField(primary_key=True)
    title=models.CharField(verbose_name='個人部落格標題',max_length=64)
    site_name=models.CharField(verbose_name='站點名稱',max_length=64)
    theme=models.CharField(verbose_name='部落格主題',max_length=32)
    def  __str__(self):
        return  self.title
View Code

   4.2:一對多

#部落格表
class  Bolg(models.Model):
    nid=models.AutoField(primary_key=True)
    title=models.CharField(verbose_name='個人部落格標題',max_length=64)
    site_name=models.CharField(verbose_name='站點名稱',max_length=64)
    theme=models.CharField(verbose_name='部落格主題',max_length=32)
    def  __str__(self):
        return  self.title
#文章分類表
class  Category(models.Model):
    nid =models.AutoField(primary_key=True)
    title=models.CharField(verbose_name='分類名稱',max_length=32)
    blog=models.ForeignKey(verbose_name='所屬部落格',to='Bolg',to_field='nid',on_delete=None) # 一對多
    def  __str__(self):
        return self.title
View Code

  4.3:多對多

#標籤表
class Tag(models.Model):
    nid=models.AutoField(primary_key=True)
    title=models.CharField(verbose_name='標籤名稱',max_length=32)
    blog = models.ForeignKey(to='Bolg',to_field='nid',on_delete=None)
    def __str__(self):
        return self.title
#文章表
class  Article(models.Model):
    nid=models.AutoField(primary_key=True)
    title=models.CharField(verbose_name='文章標題',max_length=64)
    desc=models.CharField(verbose_name='文章摘要',max_length=255)
    create_data=models.DateTimeField(verbose_name='建立時間',auto_now_add=True)
    content=models.TextField()


    user = models.ForeignKey(to='UserInfo',to_field='nid',on_delete=None)
    category=models.ForeignKey(to='Category',to_field='nid',on_delete=None)
    # 多對多
    tags=models.ManyToManyField(to='Tag',through='Article2Tag',through_fields=('article','tag'))

    comment_count=models.IntegerField(default=0)
    up_count=models.IntegerField(default=0)
    down_count=models.IntegerField(default=0)

    def __str__(self):
        return  self.title
View Code

五:model欄位引數

<1> CharField
       字串欄位, 用於較短的字串.
       CharField 要求必須有一個引數 maxlength, 用於從資料庫層和Django校驗層限制該欄位所允許的最大字元數.

<2> IntegerField
      #用於儲存一個整數.

<3> FloatField
       一個浮點數. 必須 提供兩個引數:

       引數    描述
       max_digits    總位數(不包括小數點和符號)
       decimal_places    小數位數
               舉例來說, 要儲存最大值為 999 (小數點後儲存2位),你要這樣定義欄位:

               models.FloatField(..., max_digits=5, decimal_places=2)
               要儲存最大值一百萬(小數點後儲存10位)的話,你要這樣定義:

               models.FloatField(..., max_digits=19, decimal_places=10)
               admin 用一個文字框(<input type="text">)表示該欄位儲存的資料.

<4> AutoField
       一個 IntegerField, 新增記錄時它會自動增長. 你通常不需要直接使用這個欄位;
       自定義一個主鍵:my_id=models.AutoField(primary_key=True)
       如果你不指定主鍵的話,系統會自動新增一個主鍵欄位到你的 model.

<5> BooleanField
       A true/false field. admin 用 checkbox 來表示此類欄位.

<6> TextField
       一個容量很大的文字欄位.
       admin 用一個 <textarea> (文字區域)表示該欄位資料.(一個多行編輯框).

<7> EmailField
       一個帶有檢查Email合法性的 CharField,不接受 maxlength 引數.

<8> DateField
       一個日期欄位. 共有下列額外的可選引數:
       Argument    描述
       auto_now    當物件被儲存時,自動將該欄位的值設定為當前時間.通常用於表示 "last-modified" 時間戳.
       auto_now_add    當物件首次被建立時,自動將該欄位的值設定為當前時間.通常用於表示物件建立時間.
       (僅僅在admin中有意義...)

<9> DateTimeField
        一個日期時間欄位. 類似 DateField 支援同樣的附加選項.

<10> ImageField
       類似 FileField, 不過要校驗上傳物件是否是一個合法圖片.#它有兩個可選引數:height_field和width_field,
       如果提供這兩個引數,則圖片將按提供的高度和寬度規格儲存.    
<11> FileField
    一個檔案上傳欄位.
    要求一個必須有的引數: upload_to, 一個用於儲存上載檔案的本地檔案系統路徑. 這個路徑必須包含 strftime #formatting,
    該格式將被上載檔案的 date/time
    替換(so that uploaded files don't fill up the given directory).
    admin 用一個<input type="file">部件表示該欄位儲存的資料(一個檔案上傳部件) .

    注意:在一個 model 中使用 FileField 或 ImageField 需要以下步驟:
           (1)在你的 settings 檔案中, 定義一個完整路徑給 MEDIA_ROOT 以便讓 Django在此處儲存上傳檔案.
           (出於效能考慮,這些檔案並不儲存到資料庫.) 定義MEDIA_URL 作為該目錄的公共 URL. 要確保該目錄對
            WEB伺服器使用者帳號是可寫的.
           (2) 在你的 model 中新增 FileField 或 ImageField, 並確保定義了 upload_to 選項,以告訴 Django
            使用 MEDIA_ROOT 的哪個子目錄儲存上傳檔案.你的資料庫中要儲存的只是檔案的路徑(相對於 MEDIA_ROOT).
            出於習慣你一定很想使用 Django 提供的 get_<#fieldname>_url 函式.舉例來說,如果你的 ImageField
            叫作 mug_shot, 你就可以在模板中以 {{ object.#get_mug_shot_url }} 這樣的方式得到影象的絕對路徑.

<12> URLField
     用於儲存 URL. 若 verify_exists 引數為 True (預設), 給定的 URL 會預先檢查是否存在( 即URL是否被有效裝入且
     沒有返回404響應).
     admin 用一個 <input type="text"> 文字框表示該欄位儲存的資料(一個單行編輯框)

<13> NullBooleanField
      類似 BooleanField, 不過允許 NULL 作為其中一個選項. 推薦使用這個欄位而不要用 BooleanField 加 null=True 選項
      admin 用一個選擇框 <select> (三個可選擇的值: "Unknown", "Yes" 和 "No" ) 來表示這種欄位資料.

<14> SlugField
      "Slug" 是一個報紙術語. slug 是某個東西的小小標記(短籤), 只包含字母,數字,下劃線和連字元.#它們通常用於URLs
      若你使用 Django 開發版本,你可以指定 maxlength. 若 maxlength 未指定, Django 會使用預設長度: 50.  #在
      以前的 Django 版本,沒有任何辦法改變50 這個長度.
      這暗示了 db_index=True.
      它接受一個額外的引數: prepopulate_from, which is a list of fields from which to auto-#populate
      the slug, via JavaScript,in the object's admin form: models.SlugField
      (prepopulate_from=("pre_name", "name"))prepopulate_from 不接受 DateTimeFields.

<13> XMLField
       一個校驗值是否為合法XML的 TextField,必須提供引數: schema_path, 它是一個用來校驗文字的 RelaxNG schema #的檔案系統路徑.

<14> FilePathField
       可選專案為某個特定目錄下的檔名. 支援三個特殊的引數, 其中第一個是必須提供的.
       引數    描述
       path    必需引數. 一個目錄的絕對檔案系統路徑. FilePathField 據此得到可選專案.
       Example: "/home/images".
       match    可選引數. 一個正則表示式, 作為一個字串, FilePathField 將使用它過濾檔名.
       注意這個正則表示式只會應用到 base filename 而不是
       路徑全名. Example: "foo.*\.txt^", 將匹配檔案 foo23.txt 卻不匹配 bar.txt 或 foo23.gif.
       recursive可選引數.要麼 True 要麼 False. 預設值是 False. 是否包括 path 下面的全部子目錄.
       這三個引數可以同時使用.
       match 僅應用於 base filename, 而不是路徑全名. 那麼,這個例子:
       FilePathField(path="/home/images", match="foo.*", recursive=True)
       ...會匹配 /home/images/foo.gif 而不匹配 /home/images/foo/bar.gif

<15> IPAddressField
       一個字串形式的 IP 地址, (i.e. "24.124.1.30").
<16> CommaSeparatedIntegerField
       用於存放逗號分隔的整數值. 類似 CharField, 必須要有maxlength引數.