Python Web(二)

 Infi-chu:css

http://www.cnblogs.com/Infi-chu/html

 

1、Django-debug-toolbarpython

django-debug-toolbar 是一組可配置的面板,可顯示有關當前請求/響應的各類調試信息,並在單擊時顯示有關面板內容的更多詳細信息。mysql

github連接:https://github.com/jazzband/django-debug-toolbarjquery

文檔連接:http://django-debug-toolbar.readthedocs.io/en/stable/git

1.安裝github

pip install django-debug-toolbar

 2.配置sql

settings.py數據庫

# 將debug-toolbar添加到APP配置中

INSTALLED_APPS = [
    …
    'debug_toolbar',
]

# 在中間件中加入DebugToolbarMiddleware

MIDDLEWARE = [
    # ...
    'debug_toolbar.middleware.DebugToolbarMiddleware',
    # ...
]

# 若是是本機調試,還在將127.0.0.1加入 INTERNAL_IPS

INTERNAL_IPS = [‘127.0.0.1’, ]

urls.pydjango

from django.conf import settings
from django.conf.urls import include, url

if settings.DEBUG:
    import debug_toolbar
    urlpatterns = [
        url(r'^__debug__/', include(debug_toolbar.urls)),
    ] + urlpatterns

 配置jQuery

DEBUG_TOOLBAR_CONFIG = {
    "JQUERY_URL": '//cdn.bootcss.com/jquery/2.2.4/jquery.min.js',
}

# 若是在Django項目中使用了jquery的話就能夠直接將這一項置爲空,那麼django-debug-toolbar 就會使用你項目中用到的jquery:

DEBUG_TOOLBAR_CONFIG = {
    "JQUERY_URL": '',
}

 

2、表與表之間的關係

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.一對多

Python Web(一)

3.多對多(經過關係表)

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)

4.多對多(不經過關係表)

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進行添加時候若是有會自動去重,他自帶聯合惟一的效果

 

3、MySQL與Django-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 不存在

 

4、MySQL與Django-orm數據類型對應屬性

null                數據庫中字段是否能夠爲空
db_column           數據庫中字段的列名
default             數據庫中字段的默認值
primary_key         數據庫中字段是否爲主鍵
db_index            數據庫中字段是否能夠創建索引
unique              數據庫中字段是否能夠創建惟一索引


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

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

 

5、Django只在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:上傳圖片的寬度保存的數據庫字段名(字符串)

 

6、Django只在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'), ]
        )

 

7、Django自帶分頁

1.導入模塊

from django.core.paginator import Paginator

2.讀取信息

userlist = models.UserInfo.objects.all()

3.生成painantor對象

生成painantor對象

paginator = Paginator(userlist, 10) #對象,每頁多少條數據

painantor的屬性與方法

  • 屬性
    • object_list:返回全部頁對象的的列表
    • per_page: 每頁顯示條目數量
    • count:數據總個數
    • num_pages:總頁數
    • page_range:總頁數的索引範圍,如: (1,10),(1,200)
  • 方法
    • page(第幾頁):page對象

4.生成page對象

生成page對象

page_1 = paginator.page(1)  #第一頁的信息

page的屬性和方法

  • 屬性
    • object_list:返回當前頁對象的的列表
    • number:返回當前頁是第幾頁,從1開始
    • paginator:當前頁對應的paginator對象
  • 方法
    • has_next(): 是否有下一頁,有就返回Ture
    • next_page_numbe()r:返回值下一頁頁碼
    • has_previous():是否有上一頁,有就返回Ture
    • previous_page_number():返回值上一頁頁碼

【注】

用orm得到表裏面信息的時候,它是個列表,能夠利用列表的切片技術來進行內容選取而達到分頁的效果

相關文章
相關標籤/搜索