django創建表單以及表單數據類型和屬性

来源:https://www.cnblogs.com/pythonywy/archive/2019/08/15/11360274.html
-Advertisement-
Play Games

08.15自我總結 關於django的表單不同關係之間的創建 一.不同關係之間的創建 1.一對一 舉例 母表:userinfo id| name| age | | 1 | 張三 |12 2| 李四 |58 字表:private id| salary | sp_id | | 1 | 100 |1 2| ...


08.15自我總結

關於django的表單不同關係之間的創建

一.不同關係之間的創建

1.一對一

舉例

母表:userinfo

id name age
1 張三 12
2 李四 58

字表:private

id salary sp_id
1 100 1
2 400 2

models.py

class UserInfo(models.Model):
    name = models.CharField(max_length=32, null=True)
    age  = models.IntegerField(null=True)
    
class Private(models.Model):
    salary = models.CharField(max_length=32, null=True)
    sp = models.OneToOneField("UserInfo", null=True) #oneTooneField: 一對一, 預設要求該欄位必須是唯一的 unique 外鍵關係

插入信息

models.UserInfo.objects.create(name='張三',age=12)
models.Private.objects.create(salary=100,sp_id=1)

查詢

#從母表查詢子表中的數據

#方法1:res = models.UserInfo.objects.filter(name='張三').first().private.salary #子表表名小寫.子表欄位名
#方法2:res = models.UserInfo.objects.filter(name='張三').values('private__salary')
#從子表查詢母表信息
#方法1:res = models.Private.objects.filter(salary='100').first().sp.name

#方法2:res = models.Private.objects.values('sp__name'):

2.多對多(通過關係表)

models.py

class Boy(models.Model):
    bname = models.CharField(max_length=30,null=True)
    
class Girl(models.Model):
    gname = models.CharField(max_length=30,null=True)

class Boy2Girl(models.Model):
    b = models.ForeignKey('Boy',null=True)
    g = models.ForeignKey('Girl',null=True)
    #聯合唯一屬性
    class Meta:
        unique_together=[
            ('b','g')
        ]

插入信息

import random
boys =[
    models.Boy(bname='男1'),
    models.Boy(bname='男2'),
    models.Boy(bname='男3'),
    models.Boy(bname='男4'),
    models.Boy(bname='男5'),
    models.Boy(bname='男6')
]
res = models.Boy.objects.bulk_create(boys)

girls =[
    models.Girl(gname='女1'),
    models.Girl(gname='女2'),
    models.Girl(gname='女3'),
    models.Girl(gname='女4'),
    models.Girl(gname='女5'),
    models.Girl(gname='女6'),
    models.Girl(gname='女7'),
    models.Girl(gname='女8'),
]
models.Girl.objects.bulk_create(girls)

a = [
    models.Boy2Girl(b_id=random.randint(1,6),g_id=1),
    models.Boy2Girl(b_id=random.randint(1,6),g_id=2),
    models.Boy2Girl(b_id=random.randint(1,6),g_id=3),
    models.Boy2Girl(b_id=random.randint(1,6),g_id=4),
    models.Boy2Girl(b_id=random.randint(1,6),g_id=5),
    models.Boy2Girl(b_id=random.randint(1,6),g_id=6),
    models.Boy2Girl(b_id=random.randint(1,6),g_id=7),
    models.Boy2Girl(b_id=random.randint(1,6),g_id=8),
]
models.Boy2Girl.objects.bulk_create(a)

查詢

#通過關係表查詢,查boy位男1對於的女的信息
#方法1:res = models.Boy2Girl.objects.filter(b__bname='男1').values('g__gname')

#方法2:
 res = models.Boy2Girl.objects.filter(b__bname='男1').all()
 for a in res:
    print(res.g.gname)
    
#通過boy表查女的信息
#方法1:    res = models.Boy.objects.filter(bname='男1').values('boy2girl__g__gname')

#方法2:
    res = models.Boy.objects.filter(bname='男1').all()
    for a in res:
        for b in a.boy2girl_set.all():
            print(b.g.gname)

3.多對多(不通過關係表)

models.py

class Boy1(models.Model):
    bname = models.CharField(max_length=32, null=True)
    g = models.ManyToManyField('Girl', null=True)
 #他會生成一個boy1_g的表

class Girl1(models.Model):
    gname = models.CharField(max_length=32, null=True)

插入信息

boys =[
    models.Boy(bname='男1'),
    models.Boy(bname='男2'),
    models.Boy(bname='男3'),
    models.Boy(bname='男4'),
    models.Boy(bname='男5'),
    models.Boy(bname='男6')
]
res = models.Boy1.objects.bulk_create(boys)
#
girls =[
    models.Girl(gname='女1'),
    models.Girl(gname='女2'),
    models.Girl(gname='女3'),
    models.Girl(gname='女4'),
    models.Girl(gname='女5'),
    models.Girl(gname='女6'),
    models.Girl(gname='女7'),
    models.Girl(gname='女8'),
]
models.Girl1.objects.bulk_create(girls)

建立兩者關係

  • 取出boy的對象
  • 再選擇其中的g對象,再進行add添加|刪除|查詢girl的id

添加(add)

models.Boy1.objects.filter(bname='男1').first().g.add(1,2,3,4,5,2) #會自動去重保持唯一性也不會因為相同而報錯

刪除(remove)

models.Boy1.objects.filter(bname='男1').first().g.remove(1)

查詢(all)

models.Boy1.objects.filter(bname='男1').first().g.all()

清除(clear)

models.Boy1.objects.filter(bname='男1').first().g.clear() #清除所有

註意點

add進行添加時候如果有會自動去重,他自帶聯合唯一的效果

4.一對多

https://www.cnblogs.com/pythonywy/p/11353202.html看這裡

二.mysql與djamgo-orm數據類型對應關係

數據類型 mysql djamgo-orm
數字 tinyint 不存在
- smallint SmallIntegerField(有符號) PositiveSmallIntegerField(沒符號)
- mediumint 不存在
- int (unsigned) IntegerField(有符號)PositiveIntegerField(沒符號)
- bigint BigIntegerField(有符號) PositiveBigIntegerField(沒符號)
- decimal DecimalField
- float FloatField
- double 不存在
字元串 char 不存在
- varchar CharField
- text TextField
時間日期 date DateField
- datetime DateTimeField
- timestamp 不存在

三.mysql與djamgo-orm數據類型對應屬性

null                資料庫中欄位是否可以為空
db_column           資料庫中欄位的列名
default             資料庫中欄位的預設值
primary_key         資料庫中欄位是否為主鍵
db_index            資料庫中欄位是否可以建立索引
unique              資料庫中欄位是否可以建立唯一索引


class Meta:
### 聯合唯一索引
unique_together=[
('b', 'g')
]

#### 聯合索引
index_together = [
('b', 'g')
]

四.djamgo只在admin中生效的數據類型

  • EmailField(CharField):字元串類型對應信息是不是郵箱格式進行驗證
  • IPAddressField(Field):字元串類型,Django Admin以及ModelForm中提供驗證 IPV4 機制
  • GenericIPAddressField(Field):字元串類型,Django Admin以及ModelForm中提供驗證 Ipv4和Ipv6
    • 參數:
      • protocol:用於指定Ipv4或Ipv6, 'both',"ipv4","ipv6"
      • unpack_ipv4: 如如果指定為True,則輸入::ffff:192.0.2.1時候,可解析為192.0.2.1,開啟刺功能,需要protocol="both"
  • URLField(CharField):字元串類型,Django Admin以及ModelForm中提供驗證 URL
  • SlugField(CharField):字元串類型,Django Admin以及ModelForm中提供驗證支持 字母、數字、下劃線、連接符(減號)
  • CommaSeparatedIntegerField(CharField):字元串類型,格式必須為逗號分割的數字
  • UUIDField(Field):字元串類型,Django Admin以及ModelForm中提供對UUID格式的驗證
  • FilePathField(Field):字元串,Django Admin以及ModelForm中提供讀取文件夾下文件的功能
    • 參數:
      • path:文件路徑
      • match=None:正則匹配
      • recursive=False:遞歸下麵的文件夾
      • allow_files=True:允許文件
      • allow_folders=False:允許文件夾
  • ImageField(FileField):字元串類型 路徑保存在資料庫,文件上傳到指定目錄
    • 參數:
      • upload_to = "" : 上傳文件的保存路徑
      • storage = None:存儲組件,預設django.core.files.storage.FileSystemStorage
      • ImageField(FileField):上傳圖片的高度保存的資料庫欄位名(字元串)
      • height_field=None:上傳圖片的寬度保存的資料庫欄位名(字元串)

五.djamgo只在admin中生效的屬性

  • verbose_name:Admin中顯示的欄位名稱

  • blank:Admin中是否允許用戶輸入為空

  • editable:Admin中是否可以編輯

  • help_text:Admin中該欄位的提示信息

  • choices:Admin中顯示選擇框的內容,用不變動的數據放在記憶體中從而避免跨表操作

    • 如:gf = models.IntegerField(choices=[(0, '何穗'),(1, '大表姐'),],default=1)
  • error_messages: 自定義錯誤信息(字典類型),從而定製想要顯示的錯誤信息;

    • from django.core.validators import RegexValidator
      from django.core.validators import EmailValidator,URLValidator,DecimalValidator, MaxLengthValidator,MinLengthValidator,MaxValueValidator,MinValueValidator
      如:
      test = models.CharField(
      max_length=32,
      error_messages={
      'c1': '優先錯信息1',
      'c2': '優先錯信息2',
      'c3': '優先錯信息3',
      },
      validators=[
      RegexValidator(regex='root_\d+', message='錯誤了', code='c1'),
      RegexValidator(regex='root_112233\d+', message='又錯誤了', code='c2'),
      EmailValidator(message='又錯誤了', code='c3'), ]
      )


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一個可以沉迷於技術的程式猿,wx加入加入技術群:fsx641385712 ...
  • 一個可以沉迷於技術的程式猿,wx加入加入技術群:fsx641385712 ...
  • 11.312 盒子模型 HTML文檔中的每個元素都被比喻成矩形盒子, 盒子模型通過四個邊界來描述:margin(外邊距),border(邊框),padding(內填充),content(內容區域),如果把一個盒子比喻成一個壁掛相片,那麼 1、css顯示模式:塊級、行內、行內塊級 在HTML中HTML ...
  • 基本思路 貪心 既然要求最小代價,當用一定順序刪除時代價一定最小,不難發現,每次都刪去x,y中最小的,最後的總代價業一定最小! 因此就可以寫出下麵的簡單的代碼 代碼 是不是很簡單呢? ...
  • 呵呵,先貼一張圖: "洛谷題目頁面傳送門" & "CodeForces題目頁面傳送門" 給定字元串$a$,求它的每一個首碼,是否能被表示成$m+1$個字元串$A$和$m$個字元串$B$交錯相連的形式,即求$\forall i\in[1,n],\left[\exists A,\exists B,a_{ ...
  • 1、字元串 1.1、如何在Python中使用字元串 a、使用單引號(') 用單引號括起來表示字元串,例如: b、使用雙引號(") 雙引號中的字元串與單引號中的字元串用法完全相同,例如: c、使用三引號(''') 利用三引號,表示多行的字元串,可以在三引號中自由的使用單引號和雙引號,例如: 2、布爾類 ...
  • 本文主要講解SpringMVC的註解方面的應用,屬於SpringMVC的入門級內容,僅供學習分享使用,如有不足之處,還請指正。 ...
  • day0 day1 day2 day4 day5 day7 day9 day10 day12 day13 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...