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'), ]
)
- from django.core.validators import RegexValidator