日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

define定义的是什么类型_为什么Django 3后建议使用Field.choices枚举类型定义choices选项...

發(fā)布時(shí)間:2024/7/23 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 define定义的是什么类型_为什么Django 3后建议使用Field.choices枚举类型定义choices选项... 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Django 3.0的主要新增功能之一是對(duì)模型字段選擇的枚舉。它是一種定義和約束模型Field.choices的更好方法。

以前在Django模型中通常會(huì)通過定義一些“常量”和元組來定義choices,如下所示:

from django.db import modelsclass Book(models.Model):UNPUBLISHED = 'UN'PUBLISHED = 'PB'STATUS_CHOICES = [(UNPUBLISHED, 'Unpublished'),(PUBLISHED, 'Published'),]status = models.CharField(max_length=2,choices=STATUS_CHOICES,default=UNPUBLISHED,)

然后其他人可以按如下方式使用這些常量,例如:

unpublished_books = Book.objects.filter(status=Book.UNPUBLISHED)

如果多個(gè)模型使用同一組選項(xiàng)choices和常量,則可能需要把choices選項(xiàng)和常量從模型級(jí)別而轉(zhuǎn)到模塊級(jí)別,此時(shí)再也不能在通過Book.UNPUBLISHED的獲取常量內(nèi)容了。

from django.db import modelsUNPUBLISHED = 'UN' PUBLISHED = 'PB' STATUS_CHOICES = [(UNPUBLISHED, 'Unpublished'),(PUBLISHED, 'Published'), ]class Book(models.Model):status = models.CharField(max_length=2,choices=STATUS_CHOICES,default=UNPUBLISHED,)class Pamphlet(models.Model):status = models.CharField(max_length=2,choices=STATUS_CHOICES,default=PUBLISHED,)

這樣在models.py文件中留下一堆沒有命名空間的常量, 這有點(diǎn)違反《 Python之禪》:

命名空間是一個(gè)很棒的主意–讓我們做更多的事!

這也使我們?nèi)鄙僖恍┯杏玫墓δ堋@?#xff0c;沒有簡單的方法可以將值轉(zhuǎn)換為其顯示標(biāo)簽。

更新(2020年1月28日): 老版模型實(shí)例Django了提供get_FOO_display()方法來轉(zhuǎn)換值choice選項(xiàng)值對(duì)應(yīng)的標(biāo)簽。

存在諸如django-choices和django-enumfields之類的軟件包來解決這些問題。我還看到了其他項(xiàng)目上幾個(gè)類似功能的自定義實(shí)現(xiàn)。

Django 3.0現(xiàn)在提供了一個(gè)Choices帶有兩個(gè)子類類IntegerChoices和TextChoices。這些類擴(kuò)展了Python的Enum類型,并增加了額外的約束和功能,以使其適用于Field.choices。

現(xiàn)在我們要轉(zhuǎn)換之前的示例,我們定義一個(gè)新的Status類,該類繼承了TextChoices類,用于替換我們之前定義的STATUS_CHOICES元組。現(xiàn)在Status.choices與STATUS_CHOICES是等同的。除此以外,你還可以使用Status.UNPUBLISHED的方式調(diào)用Status類下的常量。此時(shí)常量UNPUBLISHED有了自己的命名空間,更安全,也使代碼可讀性更高。

class Status(models.TextChoices):UNPUBLISHED = 'UN', 'Unpublished'PUBLISHED = 'PB', 'Published'class Book(models.Model):status = models.CharField(max_length=2,choices=Status.choices,default=Status.UNPUBLISHED,)class Pamphlet(models.Model):status = models.CharField(max_length=2,choices=Status.choices,default=Status.PUBLISHED,)

我們可以通過檢查未檢測(cè)到遷移變化來測(cè)試是否正確轉(zhuǎn)換:

$python manage.py makemigrations --dry-run No changes detected

如果我們添加,刪除或重新排序了任何成員,則這將被檢測(cè)為字段中的更改。這是因?yàn)檫w移框架僅看到由choices生成的列表Status.choices,而看不到枚舉類。

QuerySet過濾器可以更新為使用以下Choices類:

unpublished_books = Book.objects.filter(status=Status.UNPUBLISHED)

我們還可以輕松地將值轉(zhuǎn)換為其顯示標(biāo)簽:

In [2]: book = Book.objects.latest('id')In [3]: Status(book.status) Out[3]: <Status.UNPUBLISHED: 'UN'>In [4]: Status(book.status).label Out[4]: 'Unpublished'

更干凈!

結(jié)語

我希望這可以幫助您享受這一新的Django 3.0功能。該枚舉類型的文件涵蓋了一些細(xì)節(jié),值得一讀。感謝Shai Berger,Nick Pope,Marius Felisiak,Carlton Gibson,以及所有其他負(fù)責(zé)添加它的人(票號(hào)#27910)。

-亞當(dāng)

原文鏈接:https://adamj.eu/tech/2020/01/27/moving-to-django-3-field-choices-enumeration-types/

相關(guān)閱讀

支持異步的Django 3.X來了,你準(zhǔn)備好了嗎? Django 3.0新特色與變化詳解。

總結(jié)

以上是生活随笔為你收集整理的define定义的是什么类型_为什么Django 3后建议使用Field.choices枚举类型定义choices选项...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。