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

08.15自我總結

關於django的表單不一樣關係之間的建立

一.不一樣關係之間的建立

1.一對一

舉例html

母表: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)

創建二者關係python

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

添加(add)mysql

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

刪除(remove)sql

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

查詢(all)數據庫

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

清除(clear)django

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

注意點

add進行添加時候若是有會自動去重,他自帶聯合惟一的效果dom

4.一對多

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

二.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中顯示的字段名稱orm

  • blank:Admin中是否容許用戶輸入爲空htm

  • 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'), ]
      )

相關文章
相關標籤/搜索