Django之路由、模板和模型系統


歡迎大家訪問我的個人網站《劉江的博客和教程》:www.liujiangblog.com

主要分享Python 及Django教程以及相關的博客


一、路由系統

瀏覽器會自動給url后加一個“/”
django會自動給路由的正則表達式前面加一個“/”
django會給任何不帶“/”結尾的url語句添加“/”(可設置)
短路路由規則:匹配到第一條就忽略后面所有!
所以路由順序很重要!

1.普通路由

url(r'^index/', views.index),

2.正則路由

url(r'^page/\d+', views.page),

3.正則加括號

提供參數傳遞,按順序接收,接收到的都是字符串

# urls.py
url(r'^page/(\d+)', views.page),

# views.py
def page(request, index):
page = index
return HttpResponse("page: 第%s頁" % page)

4.正則加括號加指定參數名

提供指定參數傳遞,按參數名字進行接收,順序可變,但參數名必須相同,接收到的都是字符串

urls.py

url(r'^page/(?P<page>\d+)/(?P<number>\d+)', views.page),

views.py

def page(request, page, number):
p = page
n = number
return HttpResponse("page: 第%s頁 第%s條" %(p, n))

5.分級路由include

在app01中新建urls文件

from django.conf.urls import include
url(r'index/', include(app01.urls)),

二、模板系統

在html文件中使用模板語言

1. 普通變量

{{var}}

調用數組元素:(圓點加下標)

list1 = [1,2,3]
{{list.0}}
{{list.1}}
{{list.2}}

調用字典元素: (圓點加鍵值)

dict1 = {"k1":"v1","k2":"v2"}
{{dict1.k1}}
{{dict1.k2}}

2. if語句

在結構體內引用變量,不需要再加雙大括號

{% if 判斷 %}
......
{% else %} 
......
{% endif %}

3. for循環

{% for i in data %}
......
{% endfor %}

django內置特殊的用於for循環的變量:

forloop.counter
forloop.counter0
forloop.first
forloop.last 

  

4. 內置函數

lower    first    last    divisibleby等等。例如:
{{ “AAA”|lower}}    
使用管道符引用函數名,左邊的‘AAA’自動當作參數傳遞給lower函數
又或:判斷當前循環的次數是否能被2整除
{% if forloop.counter0|divisibleby:"2" %}
    <tr class="success">
{% else %}
    <tr>
{% endif %}    

5. 自定義函數

templatetags
register
simple_tag
filter等等
忘記這個偏門功能吧,有學它的時間不如拓展點別的知識或提高點情商。

6. 繼承模板

{% extends "xxxx.html" %}

7. 重寫模板

在母版和子版式中使用同樣的:
{% block 取個名字 %}
    (每個子版專屬的代碼)
{% endbloack %}

8.導入html代碼

{% include "xxx.html" %}

與繼承模板不同的是,導入的是xxx.html的完全代碼,因此xxx.html中最好沒有頭部,title等代碼,只有實際的功能代碼。

三、模型(model)

1. 類結構

(1)基礎類型

from django.db import models

class userinfo(models.Model):
    name = models.CharField(max_length=30)
    email = models.EmailField()
    memo = models.TextField()

(2)連表類型

一對多:models.ForeignKey("其他表")
多對多:models.ManyToManyField("其他表")
一對一:models.OneToOneField("其他表")

(3) 字段類型

1、models.AutoField  自增列 = int(11)
  如果沒有的話,默認會生成一個名稱為 id 的列,如果要顯示的自定義一個自增列,必須將給列設置為主鍵 primary_key=True。
2、models.CharField  字符串字段
  必須 max_length 參數
3、models.BooleanField  布爾類型=tinyint(1)
  不能為空,Blank=True
4、models.ComaSeparatedIntegerField  用逗號分割的數字=varchar
  繼承CharField,所以必須 max_lenght 參數
5、models.DateField  日期類型 date
  對於參數,auto_now = True 則每次更新都會更新這個時間;auto_now_add 則只是第一次創建添加,之后的更新不再改變。
6、models.DateTimeField  日期類型 datetime
  同DateField的參數
7、models.Decimal  十進制小數類型 = decimal
  必須指定整數位max_digits和小數位decimal_places
8、models.EmailField  字符串類型(正則表達式郵箱) =varchar
  對字符串進行正則表達式
9、models.FloatField  浮點類型 = double
10、models.IntegerField  整形
11、models.BigIntegerField  長整形
  integer_field_ranges = {
    'SmallIntegerField': (-32768, 32767),
    'IntegerField': (-2147483648, 2147483647),
    'BigIntegerField': (-9223372036854775808, 9223372036854775807),
    'PositiveSmallIntegerField': (0, 32767),
    'PositiveIntegerField': (0, 2147483647),
  }
12、models.IPAddressField  字符串類型(ip4正則表達式)
13、models.GenericIPAddressField  字符串類型(ip4和ip6是可選的)
  參數protocol可以是:both、ipv4、ipv6
  驗證時,會根據設置報錯
14、models.NullBooleanField  允許為空的布爾類型
15、models.PositiveIntegerFiel  正Integer
16、models.PositiveSmallIntegerField  正smallInteger
17、models.SlugField  減號、下划線、字母、數字
18、models.SmallIntegerField  數字
  數據庫中的字段有:tinyint、smallint、int、bigint
19、models.TextField  字符串=longtext
20、models.TimeField  時間 HH:MM[:ss[.uuuuuu]]
21、models.URLField  字符串,地址正則表達式
22、models.BinaryField  二進制
23、models.ImageField   圖片
24、models.FilePathField 文件

(4)參數類型

1、null=True
  數據庫中字段是否可以為空
2、blank=True
  django的 Admin 中添加數據時是否可允許空值
3、primary_key = False
  主鍵,對AutoField設置主鍵后,就會代替原來的自增 id 列
4、auto_now 和 auto_now_add
  auto_now   自動創建---無論添加或修改,都是當前操作的時間
  auto_now_add  自動創建---永遠是創建時的時間
5、choices
GENDER_CHOICE = (
        (u'M', u'Male'),
        (u'F', u'Female'),
    )
gender = models.CharField(max_length=2,choices = GENDER_CHOICE)
6、max_length
7、default  默認值
8、verbose_name  Admin中字段的顯示名稱
9、name|db_column  數據庫中的字段名稱
10、unique=True  不允許重復
11、db_index = True  數據庫索引
12、editable=True  在Admin里是否可編輯
13、error_messages=None  錯誤提示
14、auto_created=False  自動創建
15、help_text  在Admin中提示幫助信息
16、validators=[]
17、upload-to

2. 表操作

(1)基本操作

    # 增
    #
    # models.Tb1.objects.create(c1='xx', c2='oo')  增加一條數據,可以接受字典類型數據 **kwargs

    # obj = models.Tb1(c1='xx', c2='oo')
    # obj.save()

    # 查
    #
    # models.Tb1.objects.get(id=123)         # 獲取單條數據,不存在則報錯(不建議)
    # models.Tb1.objects.all()               # 獲取全部
    # models.Tb1.objects.filter(name='seven') # 獲取指定條件的數據

    # 刪
    #
    # models.Tb1.objects.filter(name='seven').delete() # 刪除指定條件的數據

    # 改
    # models.Tb1.objects.filter(name='seven').update(gender='0')  # 將指定條件的數據更新,均支持 **kwargs
    # obj = models.Tb1.objects.get(id=1)
    # obj.c1 = '111'
    # obj.save()                                                 # 修改單條數據

(2)進階操作

# 獲取個數
    #
    # models.Tb1.objects.filter(name='seven').count()

    # 大於,小於
    #
    # models.Tb1.objects.filter(id__gt=1)              # 獲取id大於1的值
    # models.Tb1.objects.filter(id__lt=10)             # 獲取id小於10的值
    # models.Tb1.objects.filter(id__lt=10, id__gt=1)   # 獲取id大於1 且 小於10的值

    # in
    #
    # models.Tb1.objects.filter(id__in=[11, 22, 33])   # 獲取id等於11、22、33的數據
    # models.Tb1.objects.exclude(id__in=[11, 22, 33])  # not in

    # contains
    #
    # models.Tb1.objects.filter(name__contains="ven")
    # models.Tb1.objects.filter(name__icontains="ven") # icontains大小寫不敏感
    # models.Tb1.objects.exclude(name__icontains="ven")

    # range
    #
    # models.Tb1.objects.filter(id__range=[1, 2])   # 范圍bettwen and

    # 其他類似
    #
    # startswith,istartswith, endswith, iendswith,

    # order by
    #
    # models.Tb1.objects.filter(name='seven').order_by('id')    # asc
    # models.Tb1.objects.filter(name='seven').order_by('-id')   # desc

    # limit 、offset
    #
    # models.Tb1.objects.all()[10:20]

    # group by
    from django.db.models import Count, Min, Max, Sum
    # models.Tb1.objects.filter(c1=1).values('id').annotate(c=Count('num'))
    # SELECT "app01_tb1"."id", COUNT("app01_tb1"."num") AS "c" FROM "app01_tb1" WHERE "app01_tb1"."c1" = 1 GROUP BY "app01_tb1"."id"


# F 使用查詢條件的值
    #
    # from django.db.models import F
    # models.Tb1.objects.update(num=F('num')+1)

    # Q 構建搜索條件
    from django.db.models import Q
    # con = Q()
    #
    # q1 = Q()
    # q1.connector = 'OR'
    # q1.children.append(('id', 1))
    # q1.children.append(('id', 10))
    # q1.children.append(('id', 9))
    #
    # q2 = Q()
    # q2.connector = 'OR'
    # q2.children.append(('c1', 1))
    # q2.children.append(('c1', 10))
    # q2.children.append(('c1', 9))
    #
    # con.add(q1, 'AND')
    # con.add(q2, 'AND')
    #
    # models.Tb1.objects.filter(con)

    #
    # from django.db import connection
    # cursor = connection.cursor()
    # cursor.execute("""SELECT * from tb where name = %s""", ['Lennon'])
    # row = cursor.fetchone()

其他操作

(3) 連表操作

models.py

#_*_coding:utf-8_*_
from django.db import models

# Create your models here.

class Colors(models.Model):
    colors=models.CharField(u'顏色',max_length=10)
    def __unicode__(self):
        return self.colors

class Ball(models.Model):
    color=models.OneToOneField("Colors")  #與顏色表為一對一,顏色表為母表
    description=models.CharField(u'描述',max_length=10)
    def __unicode__(self):
        return self.description

class Clothes(models.Model):
    color=models.ForeignKey("Colors")   #與顏色表為外鍵,顏色表為母表
    description=models.CharField(u'描述',max_length=10)
    def __unicode__(self):
        return self.description    
    
class Child(models.Model):
    name=models.CharField(u'姓名',max_length=10)   
    favor=models.ManyToManyField('Colors')    #與顏色表為多對多

一對一

#子表查詢母表,找到紅球對應的顏色
#寫法1:
print(models.Ball.objects.get(description="紅球").color.colors)  #返回紅,通過子表查詢母表,寫法:"子表對象.母表表名的小寫.母表字段名" ;通過Ball表查到description為"紅球",查找到對應colors
#寫法2,反向從母表入手:
print(models.Colors.objects.get(ball__description="紅球").colors) #返回紅,通過子表查詢母表,但形式上是從母表對象自身直接獲取字段,寫法:"母表.objects.get(子表名小寫__子表字段="xxx").母表字段名" ;效果和上邊完全一致,另一種形式


#母表查詢子表,找到紅色對應的球的名字
#寫法1:
print(models.Colors.objects.get(colors="紅").ball.description)  #返回紅球,通過母表查詢子表,寫法:"母表對象.子表表名的小寫.子表字段名";找到顏色為紅色的Ball的description
#寫法2,反向從子表入手:
print(models.Ball.objects.get(color__colors="紅").description)  #返回紅球,通過母表查詢子表,但形式上是從子表對象自身直接獲取字段,寫法:"子表.objects.get(一對一的子表字段__母表字段="xxx").子表字段";效果和上邊完全一致,另一種形式

增:

#添加一種顏色黑,並添加黑球
color_obj=models.Colors.objects.create(colors="黑")  #先在母表中創建顏色,並實例化給顏色表對象
models.Ball.objects.create(color=color_obj,description="黑球")  #更新Ball表,color字段為顏色表對象,添加description字段

#增添數據的三種寫法:
#寫法1:
color_obj=models.Colors.objects.create(colors="黑")
models.Ball.objects.create(color=color_obj,description="黑球")
#寫法1補充:
color_id=models.Colors.objects.create(colors="黑").id
models.Ball.objects.create(color_id=color_id,description="黑球")
#寫法2:
color_obj=models.Colors.objects.create(colors="黑")
ball_obj=models.Ball(color=color_obj,description="黑球")
ball_obj.save()
#寫法3(字典導入):
color_obj=models.Colors.objects.create(colors="黑")
ball_dic={'description':"黑球"}
models.Ball.objects.create(color=color_obj,**ball_dic)

改:

color_obj=models.Colors.objects.get(colors="黑") #.get()等同於.filter().first()
color_obj.colors="灰"
color_obj.save()
models.Ball.objects.filter(description="黑球").update(color=color_obj,description="灰球") #update(),delete()是QuerySet的方法


#更新一條數據
color_obj=models.Colors.objects.get(colors="黑")
color_obj.colors="灰"
color_obj.save()
#更新多條數據,把滿足條件的球的description都變為灰球
#寫法1:
models.Ball.objects.filter(color__colors="紅").update(description="灰球")
#寫法2:
up_dic={"description":"灰球"}
models.Ball.objects.filter(id__gt=0).update(**up_dic)

刪:

models.Ball.objects.get(description="灰球").delete() #對象和QuerySet都有方法delete()
models.Colors.objects.filter(colors="灰").delete()

models.Colors.objects.all().delete() #清空一張表

一對多(外鍵)

查:

#外鍵表聯合查詢:

#外鍵子表查詢母表,與一對一子表查詢母表形式一致
#找到紅褲衩所屬的顏色表中的顏色--返回:紅
#寫法1:
print(models.Clothes.objects.get(description="紅內褲").color.colors)  #返回紅,通過子表查詢母表,寫法:"子表對象.母表表名的小寫.母表字段名" ;通過Clothes表查到description為"紅內褲",查找到對應colors
#寫法2,反向從母表入手:
print(models.Colors.objects.get(clothes__description="紅內褲").colors)  #返回紅,通過子表查詢母表,但形式上是從母表對象自身直接獲取字段,寫法:"母表.objects.get(子表名小寫__子表字段="xxx").母表字段名" ;效果和上邊完全一致,另一種形式

#外鍵母表查詢子表,與一對一形式不同,因為母表為"多",不能像一對一一樣通過.get().子表.子表字段的方式獲取,但與多對多母表查詢子表一致
#找到顏色為紅的所有服裝--返回:[<Clothes: 紅內衣>, <Clothes: 紅內褲>]
#寫法1:
color_obj=models.Colors.objects.get(colors="紅")
print(color_obj.clothes_set.all())  #注意:子表小寫_set的寫法,它實際上是一個QuerySet,可以用update,delete,all,filter等方法
#寫法2:
print(models.Clothes.objects.filter(color=models.Colors.objects.get(colors="紅")))
#寫法2簡便寫法(推薦):
print(models.Clothes.objects.filter(color__colors="紅"))  #寫法:filter(子表外鍵字段__母表字段='過濾條件')
#寫法3:
color_id=models.Colors.objects.get(colors="紅").id  #通過母表獲取到顏色為紅的id
print(models.Clothes.objects.filter(color_id=color_id))  #filter得到QuerySet,寫法:filter(子表外鍵字段_母表主鍵=母表主鍵對象)

 備注:通過QuerySet的.values()方法,將QuerySet轉化為ValuesQuerySet

print(models.Clothes.objects.filter(color=models.Colors.objects.get(colors="紅")).values('color__colors','description'))  #獲取子表的description字段,和母表的colors字段,獲取母表字段寫法: 子表外鍵字段名__母表字段名--適用於values()或filter()
#簡寫形式補充:
print(models.Clothes.objects.filter(color__colors="紅").values('color__colors','description'))
#返回:
[{'description': u'\u7ea2\u5185\u8863', 'color__colors': u'\u7ea2'}, {'description': u'\u7ea2\u5185\u88e4', 'color__colors': u'\u7ea2'}]
#如果不加values(),返回的是[<Clothes: 紅內衣>, <Clothes: 紅內褲>]這樣一個QuerySet集合,通過values可以形成一個列表,列表中的每一個元素是一個字典,可以通過list()將ValuesQeurySet轉化為列表,之后返回給templates


#另外可通過.values_list()將QuerySet轉化為ValuesListQuerySet。返回:[(u'\u7ea2', u'\u7ea2\u889c\u5b50'), (u'\u7ea2', u'\u7ea2\u889c\u5b50')]
#得到的是一個列表,列表中是多個元組,每個元組是ValuesQuerySet中字典的value,常用於從models里將數據取出后動態添加到前端模板中的select選項中。
#通過forms.py從models取值傳給前端select選項,需重啟django后,select選項才能更新,可在定義form時,添加如下關鍵字保障動態更新select選項
#forms.py
from django import forms
from test1 import models
class ClothesForm(forms.Form):
    color=forms.IntegerField(required=True,widget=forms.Select(),)
    def __init__(self,*args,**kwargs):  #定義這個關鍵字段,當使用form時,colors表新增了顏色,前端ClothesForm的color字段的選項會自動更新
        super(ClothesForm, self).__init__(*args,**kwargs)
        self.fields['color'].widget.choices=models.Colors.objects.all().order_by('id').values_list('id','colors')

增:

 #增添子表數據,形式與一對一一致
#添加顏色為綠的服裝:綠褲頭
#方法1:
models.Clothes.objects.create(color=models.Colors.objects.get(colors="綠"),description="綠褲頭")
#方法1補充:
models.Clothes.objects.create(color_id=models.Colors.objects.get(colors="綠").id,description="綠褲頭")
#方法2:
c_obj=models.Clothes(color=models.Colors.objects.get(colors="綠"),description="綠褲頭")
c_obj.save()
#方法3:字典方式錄入..參考一對一

改:

 #顏色為紅的服裝,description都更新為紅襪子
#寫法1:
models.Clothes.objects.filter(color__colors="紅").update(description="紅襪子")
#寫法2:
models.Clothes.objects.filter(color_id=models.Colors.objects.get(colors="紅").id).update(description="紅襪子")
#寫法3:
colors_obj=models.Colors.objects.get(colors="紅")
colors_obj.clothes_set.filter(id__gte=1).update(description="紅襪子")
#其他寫法參照一對一的修改和外鍵的查詢

刪:

 models.Clothes.objects.get(description="灰裙子").delete() #對象和QuerySet都有方法delete()
models.Colors.objects.filter(colors="灰").delete()

多對多

查:

 #多對多子表查詢母表,查找小明喜歡哪些顏色--返回:[<Colors: 紅>, <Colors: 黃>, <Colors: 藍>]
#與一對多子表查詢母表的形式不同,因為一對多,查詢的是母表的“一”;多對多,查詢的是母表的“多”
#寫法1:
child_obj=models.Child.objects.get(name="小明")  #寫法:子表對象.子表多對多字段.過濾條件(all()/filter())
print(child_obj.favor.all())
#寫法2,反向從母表入手:
print(models.Colors.objects.filter(child__name="小明")) #母表對象.filter(子表表名小寫__子表字段名="過濾條件")


#多對多母表查詢子表,查找有哪些人喜歡黃色--返回:[<Child: 小明>, <Child: 丫蛋>]
#與一對多母表查詢子表的形式完全一致,因為查到的都是QuerySet,一對多和多對多,都是在查詢子表的“多”
#寫法1:
color_obj=models.Colors.objects.get(colors="黃")
print(color_obj.child_set.all())
#寫法2:
print(models.Child.objects.filter(favor=models.Colors.objects.get(colors="黃")))
#寫法2簡便寫法(推薦):
print(models.Child.objects.filter(favor__colors="黃"))  #寫法:filter(子表外鍵字段__母表字段='過濾條件')
#寫法3:
color_id=models.Colors.objects.get(colors="黃").id  #通過母表獲取到顏色為紅的id
print(models.Child.objects.filter(favor=color_id))  #filter得到QuerySet,寫法:filter(子表外鍵字段=母表主鍵對象),此處和一對多略有不同,是子表外鍵字段而不是外鍵字段_母表主鍵

增與改(增添子表或母表數據參照一對一的增,多對多重點在於關系表的對應關系變更):

#添加子表關聯關系
#添加小呆並讓他喜歡所有顏色
#寫法1:
child_obj=models.Child.objects.create(name="小呆")  #如果是已有用戶,使用.get()
colors_obj=models.Colors.objects.all()  #創建顏色表的所有顏色QuerySet對象
child_obj.favor.add(*colors_obj)  #添加對應關系,將小呆和所有顏色進行關聯,寫法:子表對象.子表多對多字段.add(*QuerySet對象)
#寫法2:
child_obj=models.Child.objects.get(name="小呆")
colors_obj=models.Colors.objects.all()
child_obj.favor=colors_obj
child_obj.save()
#讓小呆喜歡黃色和藍色(2種寫法和上邊一致,只展示一種寫法)
child_obj=models.Child.objects.get(name="小呆")
colors_obj=models.Colors.objects.filter(colors__in=["藍","黃"])  #models默認只能用這種方式得到並集,如需更復雜的過濾邏輯,需使用模塊Q
child_obj.favor.clear()  #清空小呆已經喜歡的顏色
child_obj.favor.add(*colors_obj)  #add是追加模式,如果當前小呆已經喜歡綠色,那么執行后,小呆會額外喜歡藍,黃
#讓小呆喜歡綠色(2種寫法和上邊一致,只展示一種寫法)
child_obj=models.Child.objects.get(name="小呆")
colors_obj=models.Colors.objects.get(colors="綠")
child_obj.favor.clear()
child_obj.favor.add(colors_obj)  #此處沒有*


#添加母表關聯關系
#讓喜歡藍色的人里添加小呆,可以用上邊的方法,一個效果,讓小呆喜歡藍色,下邊介紹反向插入(從母表入手)的寫法
child_obj=models.Child.objects.get(name="小呆")
colors_obj=models.Colors.objects.get(colors="藍")
colors_obj.child_set.add(child_obj)  #從colors表插入小呆,寫法:母表對象.子表名小寫_set.add(子表對象)。 讓喜歡藍色的child_set集合添加name="小呆"
#讓所有人都喜歡藍色
children_obj=models.Child.objects.all()
colors_obj=models.Colors.objects.get(colors="藍")
colors_obj.child_set.add(*children_obj)
#關於_set寫法,是否已經有些暈了,究竟什么時候使用_set,簡單記憶,只有子表才有"子表名小寫_set"的寫法,得到的是一個QuerySet集合,后邊可以接.add(),.remove(),.update(),.delete(),.clear()
#另外備注一下,colors_obj.child_set.clear()是讓所有人喜歡的顏色里去掉藍色,colors_obj.child_set.all().delete()是刪除.child_set的所有人

刪:
刪除多對多表關系

#刪除子表與母表關聯關系
#讓小呆不喜歡任何顏色
#寫法1:
child_obj=models.Child.objects.get(name="小呆")
colors_obj=models.Colors.objects.all()
child_obj.favor=''
child_obj.save()
#寫法2:
child_obj=models.Child.objects.get(name="小呆")
colors_obj=models.Colors.objects.all()
child_obj.favor.remove(*colors_obj)
#寫法3:
child_obj=models.Child.objects.get(name="小呆")
child_obj.favor.clear()
#其他例子參照多對多的增與改案例,這里不做舉例

#刪除母表與子表關聯關系
#讓所有人不再喜歡藍色
#寫法1:
children_obj=models.Child.objects.all()
colors_obj=models.Colors.objects.get(colors="藍")
colors_obj.child_set.remove(*children_obj)
#寫法2:
colors_obj=models.Colors.objects.get(colors="藍")
colors_obj.child_set.clear()

刪除多對多表數據:

#刪除子表數據
#喜歡藍色的所有人都刪掉
colors_obj=models.Colors.objects.get(colors="藍")
colors_obj.child_set.all().delete()  #注意有.all()
#刪除所有child
models.Child.objects.all().delete()

刪除母表數據:

默認情況下,如此例中,刪除“紅”色,那么子表與顏色表是一對一或外鍵關系的,子表對應數據會自動刪除,如:紅球,紅內褲
與顏色表是多對多關系的話,不會自動刪除喜歡紅色的人,而是去掉紅色已選
如果想讓與母表外鍵關聯的子表在刪除外鍵之后依舊可以保留子表數據,需要子表建表時加入以下字段:

class Clothes(models.Model):
    color=models.ForeignKey("Colors",null=True,on_delete=models.SET_NULL))  #可為空,如果外鍵被刪后,子表數據此字段置空而不是直接刪除這條數據,同理也可以SET_DEFAULT,需要此字段有默認值
    description=models.CharField(u'描述',max_length=10) 

choice

#choices相當於實現一個簡化版的外鍵,外鍵的選項不能動態更新,如可選項目較少,可以采用
#先在models添加choices字段
class Child(models.Model):
    sex_choice=((0,"男"),(1,"女"))
    name=models.CharField(u'姓名',max_length=10)
    favor=models.ManyToManyField('Colors')    #與顏色表為多對多
    sex=models.IntegerField(choices=sex_choice,default=0)
    def __unicode__(self):
        return self.name

#在views.py中調用
child_obj=models.Child.objects.get(name="小呆")
print(child_obj.sex)  #返回0或1
print(child_obj.get_sex_display())  #返回男或女


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM