ORM的相關操作


 

 

ORM單表查詢,跨表查詢,分組查詢

queryset特性和queryset優化

select_related 和 prefetch_relat查詢優化

 

            ORM的概念           

ORM是通過使用描述對象和數據庫之間映射的元數據,將程序中的對象自動持久化到關系數據庫中。
ORM在業務邏輯層和數據庫層之間充當了橋梁的作用。
ORM的優勢:ORM解決的主要問題是對象和關系的映射
ORM提供了對數據庫的映射,不用直接編寫SQL代碼,只需像操作對象一樣從數據庫操作數據。
ORM的劣勢:在一定程度上犧牲程序的執行效率。
ORM是“對象-關系-映射”的簡稱
MVC或者MTV框架中包括一個重要的部分,就是ORM,它實現了數據模型與數據庫的解耦,即數據模型的設計不需要依賴於特定的數據庫


           在Django中使用ORM連接Mysql           

'''
1. 手動創建數據庫
2. 在settings.py里面配置一下數據庫的連接信息(告訴Django連接哪一個數據庫)
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.mysql',  # 連接數據庫的類型
            'NAME': 'day62xiawu',  # 數據庫名字
            'HOST': '127.0.0.1',  # IP
            'PORT': 3306,  # 端口
            'USER': 'root',  # 用戶名
            'PASSWORD': '123456',  # 密碼
        }
    }
3. 在和settings.py同目錄下的__init__.py文件中,告訴Django用pymysql代替MySQLdb來連接數據庫
    import pymysql
    pymysql.install_as_MySQLdb()
4. 在app/models.py中,定義類,類一定要繼承models.Model
    class Book(models.Model):
        id = models.AutoField(primary_key=True)
        title = models.CharField(max_length=32)
5. 執行兩條命令
    1. 在哪兒執行?
        在項目的根目錄(有manage.py文件的那個目錄)
    2. 命令
        python manage.py makemigrations   --> 將models.py文件中的改動記錄在小本本(app/migrations/00xx_****.py)上
        
        python manage.py migrate           --> 將改動翻
'''

         常用字段         

'''
1.AutoField 
int自增列,必須填入參數 primary_key=True 沒有自增列,則自動會創建一個列名為id的列。
因此在創建表的時候id不寫,也能創建成功,默認創建一個id字段
id=models.AutoField(primary_key=True)
2.IntegerField(10位的長度)
整數類型,范圍在 -2147483648 to 2147483647。
使用IntegerField類型不能存手機號,手機號是11位。用來存age
BigIntegerField(19位)可以用來存手機號

3.CharField:表示varcharage=models.IntegerField()
字符類型,必須提供max_length參數, max_length表示字符長度。
name=models.CharField(max_length=255)
4.DecimalField 10進制小數
參數:max_digits,小數總長度
decimal_places,小數位長度
5.自定義char類型字段:
class FixedCharField(models.Field):
"""
自定義的char類型的字段類
"""
def __init__(self, max_length, *args, **kwargs):
self.max_length = max_length
super(FixedCharField, self).__init__(max_length=max_length, *args, **kwargs)

def db_type(self, connection):
"""
限定生成數據庫表的字段類型為char,長度為max_length指定的值
"""
return 'char(%s)' % self.max_length
class Class(models.Model):
id = models.AutoField(primary_key=True)
title = models.CharField(max_length=25)
# 使用自定義的char類型的字段
cname = FixedCharField(max_length=25)
6.DateField 日期字段,日期格式 YYYY-MM-DD 相當於Python中的datetime.date()實例
DateTimeField 日期時間字段,格式 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ] 相當於Python中的datetime.datetime()
DateField和DateTimeField有兩個屬性:
1. auto_now_add=True,創建數據記錄的時候會把當前時間添加到數據庫。相當於人的生日
2.auto_now=True,每次更新數據記錄的時候會更新該字段
不能同時用,一般都設置auto_now_add=True
birthdy=models.DateField(auto_now_add=True)
在表中添加數據時需要手動添加birthday 在create創建時,不用添加birthday,會自動添加
7.datetime.timedelta類型
求失效的時間
import datetime
now=datetime.datetime.now()
print(now)
#有效其七天
d7=datetime.timedelta(days=7) #也可以weeks,不能years 一年52周
ret=now+d7
print(ret)
8.FileField 文件類型
綁定上傳的文件到表單,后台接收request.FIlES
為了上傳文件,需要確保你的<form> 元素正確定義enctype 為"multipart/form-data":
<form enctype="multipart/form-data" method="post" action="/foo/">
avatar = models.FileField(upload_to="avatars/", default="avatars/default.png", verbose_name="頭像")
def upload(request):
if request.method=="POST":
file_obj=request.FIlES.get('upload_file')
filename=file_obj.name
with open(filename,"wb") as f:
for line in file_obj:
f.write(line)
return HttpResponse("上傳成功")
return render(request,"upload.html")
 
         
'''

字段合集

 

AutoField(Field)
        - int自增列,必須填入參數 primary_key=True

    BigAutoField(AutoField)
        - bigint自增列,必須填入參數 primary_key=True

        注:當model中如果沒有自增列,則自動會創建一個列名為id的列
        from django.db import models

        class UserInfo(models.Model):
            # 自動創建一個列名為id的且為自增的整數列
            username = models.CharField(max_length=32)

        class Group(models.Model):
            # 自定義自增列
            nid = models.AutoField(primary_key=True)
            name = models.CharField(max_length=32)

    SmallIntegerField(IntegerField):
        - 小整數 -3276832767

    PositiveSmallIntegerField(PositiveIntegerRelDbTypeMixin, IntegerField)
        - 正小整數 032767
    IntegerField(Field)
        - 整數列(有符號的) -21474836482147483647

    PositiveIntegerField(PositiveIntegerRelDbTypeMixin, IntegerField)
        - 正整數 02147483647

    BigIntegerField(IntegerField):
        - 長整型(有符號的) -92233720368547758089223372036854775807

    BooleanField(Field)
        - 布爾值類型

    NullBooleanField(Field):
        - 可以為空的布爾值

    CharField(Field)
        - 字符類型
        - 必須提供max_length參數, max_length表示字符長度

    TextField(Field)
        - 文本類型

    EmailField(CharField):
        - 字符串類型,Django Admin以及ModelForm中提供驗證機制

    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,       允許文件夾

    FileField(Field)
        - 字符串,路徑保存在數據庫,文件上傳到指定目錄
        - 參數:
            upload_to = ""      上傳文件的保存路徑
            storage = None      存儲組件,默認django.core.files.storage.FileSystemStorage

    ImageField(FileField)
        - 字符串,路徑保存在數據庫,文件上傳到指定目錄
        - 參數:
            upload_to = ""      上傳文件的保存路徑
            storage = None      存儲組件,默認django.core.files.storage.FileSystemStorage
            width_field=None,   上傳圖片的高度保存的數據庫字段名(字符串)
            height_field=None   上傳圖片的寬度保存的數據庫字段名(字符串)

    DateTimeField(DateField)
        - 日期+時間格式 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ]

    DateField(DateTimeCheckMixin, Field)
        - 日期格式      YYYY-MM-DD

    TimeField(DateTimeCheckMixin, Field)
        - 時間格式      HH:MM[:ss[.uuuuuu]]

    DurationField(Field)
        - 長整數,時間間隔,數據庫中按照bigint存儲,ORM中獲取的值為datetime.timedelta類型

    FloatField(Field)
        - 浮點型

    DecimalField(Field)
        - 10進制小數
        - 參數:
            max_digits,小數總長度
            decimal_places,小數位長度

    BinaryField(Field)
        - 二進制類型

字段合集
View Code

 

          字段參數        

1.null:null 是針對數據庫而言,如果 null=True, 表示數據庫的該字段可以為空
blank 是針對表單的,如果 blank=True,表示你的表單填寫該字段的時候可以不填,但是對數據庫來說,沒有任何影響
2.unique:如果設置為unique=True 則該字段在此表中必須是唯一的。如身份證號,手機號都要設置唯一的
3.db_index:如果db_index=True 則代表着為此字段設置索引
4.default

            關系字段        

ForeignKey

外鍵類型在ORM中用來表示外鍵關聯關系,一般把ForeignKey字段設置在 '一對多'中'多'的一方
字段參數:
1.to:設置要關聯的表 2to_field 設置要關聯的表的字段 3.related_name:用於代替原反向查詢時的'表名_set。即關系表中少的一方要查詢多的一方時
一個班級中有多個學生,學生是多的一方
class Classes(models.Model):
    name = models.CharField(max_length=32)
class Student(models.Model):
    name = models.CharField(max_length=32)
    the_class = models.ForeignKey(to="Classes")
正向查詢:student_obj=models.Student.objects.filter(pk=1).first()
print(student_obj.the_class.name) 
反向查詢:表名_set 查詢某個班級關聯的所有學生:models.Classes.objects.first().student_set.all()
在ForeignKey字段中添加了參數 related_name 后 the_class
= models.ForeignKey(to="Classes", related_name="students") models.Classes.objects.first().students.all()
4.on_delete 當刪除關聯表中的數據時,當前表與其關聯的行的行為
models.CASCADE 刪除關聯數據,與之關聯也刪除
publisher
= models.ForeignKey(to="Publisher",on_delete=models.CASCADE)
models.SET_NULL 刪除關聯數據,
與之關聯的值設置為null
# 表示外鍵關聯到作者表,當作者表刪除了該條數據,圖書表中不刪除,僅僅是把外鍵置空
author = models.ForeignKey(AuthModel, null=True, blank=True, on_delete=models.SET_NULL)
 models.SET_DEFAULT 刪除關聯數據,與之關聯的值設置為默認值 models.SET 刪除關聯數據,
a. 與之關聯的值設置為指定值,設置:models.SET(值) b. 與之關聯的值設置為可執行對象的返回值,
設置:models.SET(可執行對象) publisher = models.ForeignKey(to="Publisher",on_delete=models.SET(10)

OneToOneField

通常一對一字段用來擴展已有字段。
把常用的字段放在一張表中,不常用的字段放到另一張表中
比如作者姓名和名字經常用到,而年齡和地址不經常用到,就把年齡和地址放到另一張表中
class Person(models.Model):
    id=models.AutoField(primary_key=True)
    name=models.CharField(max_length=255)
    detail=models.OneToOneField(to="PersonDetail")
class PersonDetail(models.Model):
    age=models.IntegerField()
    addr=models.TextField()
正向查詢:
egon=models.Person.objects.filter(name="egon").first()
print(egon.detail.age)
反向查詢:
authorDetail_list=models.PersonDetail.objects.filter(addr="beijing")
for obj in authorDetail_list:
     print(obj.person.name)

ManyToManyField

用於表示多對多的關聯關系。在數據庫中通過第三張表來建立關聯關系
1.自己關聯自己的表 朋友的信息也存在Person這張表中。關聯的話仍關聯Person這張表。用於評論功能
class Person(models.Model):
    name = models.CharField(max_length=16)
    friends = models.ManyToManyField("self")
2.symmetrical
僅用於多對多自關聯時,指定內部是否創建反向操作的字段。默認為True。不能進行反向查詢。
可以使用person_set屬性進行反向查詢 db_table可自定義第三張表的表名
class Person(models.Model):
    name = models.CharField(max_length=16)
    friends = models.ManyToManyField("self", symmetrical=False db_table="表名"
 
        
class Author(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=16, null=False, unique=True)
    # 告訴ORM 我這張表和book表是多對多的關聯關系,ORM自動幫我生成了第三張表
    book = models.ManyToManyField(to="Book" related_name="books" )
正向查詢:
book_obj=Book.objects.filter(title="后來的我們").first()
authors=book_obj.authors.all()
for author_obj in authors:
     print(author_obj.name,author_obj.authorDetail.telephone)
反向查詢:
author_obj=Author.objects.get(name="egon")
book_list=author_obj.book_set.all()        #與egon作者相關的所有書籍
book_list=author_obj.books.all() 添加related_name="books"
for book_obj in book_list:
    print(book_obj.title)
 

         增 刪 改 查操作       

 

操作ORM時,需要明白:
1 方法是由誰調用的,返回值是什么類型
2 queryset支持鏈式操作
Book.objects.filter().order_by().reverse().count()

from django.db import models
# Create your models here.
#出版社 單表
class Publisher(models.Model):
    id = models.AutoField(primary_key=True)  # 創建一個自增的主鍵字段
    name = models.CharField(max_length=64,null=False,unique=True)   # 創建一個varchar(20)類型的不能為空的字段
# 書 兩張表連接
class Book(models.Model):
    id = models.AutoField(primary_key=True)
    title = models.CharField(max_length=64,null=False,unique=True)
    publisher=models.ForeignKey(to="Publisher") #ForeignKey會自動在屬性后面加id

#作者表 多表連接
class Author(models.Model):
    id=models.BigAutoField(primary_key=True)
    name=models.CharField(max_length=16,null=False)
    book=models.ManyToManyField(to="Book")
    # 返回對象的屬性
    def __str__(self):
        return self.name
View Code
增 刪 改 查的操作均在views.py中操作
編輯完要保存
以出版設為例:
1.單表的操作:
1.查詢數據:
方式1:get-------Obj 得到具體對象
obj=models.Publisher.objects.get(id=1)
方式2:filter---->Queryset
obj=models.Publisher.objects.filter(id=1).first()
2.添加數據:
方式1:create
    obj=Book.objects.create()
方式2:save
    obj=Book(title="A")
    obj.save()
    或者:obj=Book()
    book.title="A"
    book.save()
3.修改數據:
    queryset=models.Publisher.object.filter(id=1)
    obj=models.Publisher.object.get(id=1)
    方式1:update------->調用的對象必須是queryset
    queryset.update(price=100)
    或者:queryset.update(**{"price":100})
    方式2:Obj---->使用對象
    obj.name=new_name
    obj.save()
4.刪除數據:delete
queryset和obj均可使用
    queryset.delete()
    model_obj.delete()
models.Publisher.objects.get(id=1).delete()
2.外鍵的增刪改查:增,刪,查和單表一樣
改:book_obj=models.Book.objects.get(id)
    book_obj.name 是書的名字。是一個屬性
    book_obj.publisher_id 是和書關聯的出版社id值,是書的一個自身屬性
    book_obj.publisher 是和書關聯的出版社對象。是一個對象
    book_obj.publisher.id 出版社的id
    book_obj.publisher.name  出版社的名字
綁定一對多的關系:
book表中內容:
id   name  publish_id   
 1      A       1
 2      B       2 方法1:綁定關聯的id值
book_obj=Book(title="A",publish_id=1)
book.save()
方法2:綁定關聯的對象
book_obj=Book(title="A",publish=publish_obj) 
book.save()
方法3:
    book=Book()
    book.title="A"
    book.publish=publish_obj
    book.save()
3.多對多的操作
綁定多對多的關系
book_authors
    id   book_id  author_id   
     1      1        1
     2      1        2
     3      1        3
1.查詢id為1的作者寫哪些書
    author_obj=models.Author.objects.get(id=1)
    author_obj.books.all() 和作者關聯的所有書對象(這些對象包括書的id,書名等信息) 
2.書籍綁定作者:add
    book_obj=Book.objects.filter(pk=1).first()
    方式1:
        book_obj.authors.add(1)
        添加多個作者:
        book_obj.authors.add(1,2,3,4)
        或者:
        book_obj.authors.add(*[1,2,3,4])
    方式2:添加作者對象
        author_obj=Author.objects.get(pk=1)
        book_obj.authors.add(author_obj)
3.書籍移除作者:remove
    方式1:
    book_obj.authors.remove(1)
    移除多個作者:
    book_obj.authors.remove(2,3)
    或者:
    book_obj.authors.remove(*[2,3])
4.書籍清空作者:clear
     book_obj.authors.clear()
set的用法:一般用於編輯

set先清空數據再重新添加
原本綁定了id為1,2,3作者,使用set后,會將這3個作者清空,綁定id為8的作者
book_obj.authors.set(8)
添加多個作者時,不打散
book_obj.authors.set([1,2,3])

1.增加
在為書籍添加作者的時候,書籍已經創建。新建作者,然后顯示出書籍列表,為其選擇
在處理函數時,獲取作者或關聯的書籍,書籍是多選的不能用get獲取
author=request.POST.get("author")
# 書籍選擇是多選的,不能用get,使用getlist
books = request.POST.getlist("book")
# 創建作者
new_author_obj = models.Author.objects.create(name=author)
# 把新作者和書籍建立對應關系,自動提交
new_author_obj.books.set(books)
author_obj.books.set([1,2,3]) 把id是1、2、3的書和我這個作者關聯上
2.編輯時,修改完書籍直接使用set賦新值
book_id = request.POST.getlist("books")
author_obj=models.Author.objects.get(id=author_id)
author_obj.name=author_name
author_obj.books.set(book_id)
author_obj.save()

      中介模型   

 student_course
    id    student_id      course_id
    1         1              1

使用ManyToManyField字段,django默認會建立一張表,
這張表中只有三個字段,如果想定義其他字段,就需要使用給中介模型,通過through指定第3張表,在自定義的表中添加額外的字段

 class Student():
         name=....
         courses=models.ManyToManyFiled(to="Course",through="student_course")
     class student_course():
         student
         course
         score

在中介模型中 add/remove/set均無效

 

約會網站 記錄約會時間
###約會記錄##
# 男孩1 女孩1
# 男孩2 女孩2
# 男孩3 女孩3

 

class Boy(models.Model):
    name=models.CharField(max_length=32)
    def __str__(self):
         return self.name
class Girl(models.Model):
    name=models.CharField(max_length=32)
    #through_fields("field1","field2") 多對多建在建在哪張表,field1就是這個表的名字 field2是目標表的名字
    boys=models.ManyToManyField(to=Boy,through="Info",through_fields=("girl","boy"))  #順序不能顛倒
    def __str__(self):
         return self.name
class Info(models.Model):
    boy=models.ForeignKey(to=Boy)
    girl= models.ForeignKey(to=Girl)
    date=models.DateField(auto_now_add=True)

 

 

          元信息             

1.ORM對應的類里面包含另一個Meta類,而Meta類封裝了一些數據庫的信息。主要字段如下
db_table
ORM在數據庫中的表名默認是 app_類名,可以通過db_table可以重寫表名
class Meta:
db_table = "表名"
2.index_together 聯合索引
3.unique_together 聯合唯一索引
4.ordering
指定默認按什么字段排序 只有設置了該屬性,我們查詢到的結果才可以被reverse()

           必會的查詢操作       

返回QuerySet的有:
1. all()
3. filter()
4. exclude()
7. values_list() --> 元祖
8. values() --> 字典
9. order_by()
10. reverse()
13. distinct()
返回對象:
2. get()
5. first()
6. last()
返回數字:
11. count()
返回布爾值:
12. exist()
<1> all():                 查詢所有結果
<2> filter(**kwargs): 得到結果集 是個列表<QuerySet [<Publisher: Publisher object>]>
ret = models.Person.objects.filter(id=100) 不存在返回一個空的QuerySet,不會報錯
就算查詢的結果只有一個,返回的也是QuerySet,我們要用索引的方式取出第一個元素
ret = models.Person.objects.filter(id=1)[0]
<3> get(**kwargs): 返回與所給篩選條件相匹配的對象,返回結果有且只有一個,如果符合篩選條件的對象超過一個或者沒有都會拋出錯誤。
<4> exclude(**kwargs): 它包含了與所給篩選條件不匹配的對象
<5> values(*field): 返回一個可迭代的字典序列
ret = models.Person.objects.values("name", "birthday") 返回一個QuerySet對象,里面都是字典。 不寫字段名,默認查詢所有字段
<6> values_list(*field): 它與values()非常相似,它返回的是一個元組序列,values返回的是一個字典序列
ret = models.Person.objects.values_list()
<7> order_by(*field): 對查詢結果排序
ret = models.Person.objects.all().order_by("birthday")
<8> reverse(): 對查詢結果反向排序,請注意reverse()通常只能在具有已定義順序的QuerySet上調用(在model類的Meta中指定ordering或調用order_by()方法)。
對有序的QuerySet才能調用reverse ret = models.Person.objects.all().count()
<9> distinct(): 從返回結果中剔除重復紀錄(如果你查詢跨越多個表,可能在計算QuerySet時得到重復的結果。此時可以使用distinct(),注意只有在PostgreSQL中支持按字段去重。)
<10> count(): 返回數據庫中匹配查詢(QuerySet)的對象數量。
<11> first(): 返回第一條記錄
<12> last(): 返回最后一條記錄
<13> exists(): 如果QuerySet包含數據,就返回True,否則返回False
#all
print(models.Book.objects.all()) #得到對象的集合 <QuerySet [<Book: Book object>, <Book: Book object>, <Book: Book object>]>
#get
print(models.Publisher.objects.get(id=1))  #得到的是對象Publisher object.返回結果有且只有一個,不存在會報錯
#filter
print(models.Publisher.objects.filter(id=1)) #得到結果集 是個列表<QuerySet [<Publisher: Publisher object>]>
# 不存在返回一個空的QuerySet,不會報錯 用索引的方式取出第一個元素  ret = models.Person.objects.filter(id=1)[0]
# exclude得到不包含要求的對象
print(models.Book.objects.exclude(id=1)) #<QuerySet [<Book: Book object>, <Book: Book object>, <Book: Book object>]>
print(models.Book.objects.exclude(id=1)[0].title) #得到的是列表,使用索引得到指定的對象。得到其屬性
#values返回 QuerySet對象 字典序列
print(models.Book.objects.values())
#<QuerySet [{'id': 1, 'title': '四世同堂', 'publisher_id': 2}, {'id': 2, 'title': 'python從入門到放棄', 'publisher_id': 1}, {'id': 3, 'title': '后來的我們', 'publisher_id': 2}]>
#取其屬性
print(models.Book.objects.values()[1]["title"]) #python從入門到放棄
print(models.Book.objects.values("title","price"))
#values_list
print(models.Book.objects.values_list("title", "price"))
# order_by 按照指定的字段排序 升序
print(models.Book.objects.all().order_by( "price"))
#reverse
print(models.Person.objects.all().reverse())
#count
print(models.Book.objects.all().count())
# first 返回QuerySet中第一個對象
print(models.Book.objects.first())
# last 返回QuerySet中最后一個對象
print(models.Book.objects.all().last())
# exists 判斷表里有沒有數據
print(models.Book.objects.exists())
View Code

        Django終端打印SQL語句     

在Django項目的settings.py文件中,在最后復制粘貼如下代碼:
LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'handlers': {
        'console':{
            'level':'DEBUG',
            'class':'logging.StreamHandler',
        },
    },
    'loggers': {
        'django.db.backends': {
            'handlers': ['console'],
            'propagate': True,
            'level':'DEBUG',
        },
    }
}
View Code

       Python腳本中調用Django環境       

'''
import os
if __name__ == '__main__':
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "BMS.settings") #BMS為Django項目名
    import django
    django.setup()
'''
View Code

 

 

                 ORM中choice的用法                  

choices元組用於頁面上的選擇框標簽,第一個元素表示存在數據庫內真實的值,第二個表示頁面上顯示的具體內容
例如對應的時間:在數據庫中存數字,在頁面哈上顯示對應的具體值
class Book(models.Model):
 time_choices = (
        (1, '8:00'),
        (2, '9:00'),
        (3, '10:00'),
        (4, '11:00'),
        (5, '12:00'),
        (6, '13:00'),
        (7, '14:00'),
        (8, '15:00'),
        (9, '16:00'),
        (10, '17:00'),
        (11, '18:00'),
        (12, '19:00'),
        (13, '20:00'),
    )
    time_now = models.IntegerField(choices=time_choices)
得到choices的內容get_字段_display()
obj.get_time_now_display() 得到的是具體的時間點"8:00"


免責聲明!

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



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