MongoEngine - 欄位



一個 MongoEngine 文件類包含一個或多個屬性。每個屬性都是 Field 類的物件。BaseField 是所有欄位型別的基類。BaseField 類的建構函式具有以下引數:

BaseField(db_field, required, default, unique, primary_key)

db_field 表示資料庫欄位的名稱。

required 引數決定此欄位的值是否必填,預設為 false。

default 引數包含此欄位的預設值。

unique 引數預設為 false。如果希望每個文件的此欄位具有唯一值,則將其設定為 true。

primary_key 引數預設為 false。設定為 true 將使此欄位成為主鍵。

有許多從 BaseField 派生的 Field 類。

數值欄位

IntField(32 位整數)、LongField(64 位整數)、FloatField(浮點數)欄位建構函式具有 min_value 和 max_value 引數。

還有一個 DecimalField 類。此欄位物件的 value 是一個浮點數,可以指定其精度。DecimalField 類定義了以下引數:

DecimalField(min_value, max_value, force_string, precision, rounding)
min_value 指定最小可接受值
max_value 指定欄位的最大值
force_string 如果為 True,則此欄位的值將儲存為字串
precision 將浮點表示限制為指定位數
rounding 根據以下預定義常量對數字進行舍入:decimal.ROUND_CEILING(朝正無窮大方向舍入)、decimal.ROUND_DOWN(朝零方向舍入)、decimal.ROUND_FLOOR(朝負無窮大方向舍入)、decimal.ROUND_HALF_DOWN(四捨五入,當出現 .5 時,朝零方向舍入)、decimal.ROUND_HALF_EVEN(四捨五入,當出現 .5 時,朝最近的偶數舍入)、decimal.ROUND_HALF_UP(四捨五入,當出現 .5 時,遠離零方向舍入)、decimal.ROUND_UP(遠離零方向舍入)、decimal.ROUND_05UP(如果舍入到零方向後的最後一位數字為 0 或 5,則遠離零方向舍入;否則朝零方向舍入)

文字欄位

StringField 物件可以儲存任何 Unicode 值。您可以在建構函式中指定字串的 min_length 和 max_length。URLField 物件是一個 StringField,具有將輸入驗證為 URL 的功能。EmailField 將字串驗證為有效的電子郵件表示形式。

StringField(max-length, min_length)
URLField(url_regex)
EmailField(domain_whiltelist, allow_utf8_user, allow_ip_domain)

domain_whitelist 引數包含您不支援的無效域名列表。如果設定為 True,則 allow_utf8_user 引數允許字串包含 UTF8 字元作為電子郵件的一部分。allow_ip_domain 引數預設為 false,但如果為 true,則可以是有效的 IPV4 或 IPV6 地址。

以下示例使用數值和字串欄位:

from mongoengine import *
connect('studentDB')
class Student(Document):
   studentid = StringField(required=True)
   name = StringField()
   age=IntField(min_value=6, max-value=20)
   percent=DecimalField(precision=2)
   email=EmailField()
s1=Student()
s1.studentid='001'
s1.name='Mohan Lal'
s1.age=20
s1.percent=75
s1.email='mohanlal@gmail.com'
s1.save()

執行上述程式碼後,student 集合將顯示如下文件:

Document

ListField

這種型別的欄位包裝任何標準欄位,從而允許將多個物件用作資料庫中的列表物件。此欄位可以與 ReferenceField 一起使用以實現一對多關係。

上面示例中的 student 文件類修改如下:

from mongoengine import *
connect('studentDB')
class Student(Document):
   studentid = StringField(required=True)
   name = StringField(max_length=50)
   subjects = ListField(StringField())
s1=Student()
s1.studentid='A001'
s1.name='Mohan Lal'
s1.subjects=['phy', 'che', 'maths']
s1.save()

新增的文件以 JSON 格式顯示如下:

{
"_id":{"$oid":"5ea6a1f4d8d48409f9640319"},
"studentid":"A001",
"name":"Mohan Lal",
"subjects":["phy","che","maths"]
}

DictField

DictField 類的物件儲存 Python 字典物件。在相應的資料庫欄位中,這也將被儲存。

在上面示例中,我們將 ListField 的型別更改為 DictField。

from mongoengine import *
connect('studentDB')
class Student(Document):
   studentid = StringField(required=True)
   name = StringField(max_length=50)
   subjects = DictField()
s1=Student()
s1.studentid='A001'
s1.name='Mohan Lal'
s1.subjects['phy']=60
s1.subjects['che']=70
s1.subjects['maths']=80
s1.save()

資料庫中的文件顯示如下:

{
"_id":{"$oid":"5ea6cfbe1788374c81ccaacb"},
"studentid":"A001",
"name":"Mohan Lal",
"subjects":{"phy":{"$numberInt":"60"},
            "che":{"$numberInt":"70"},
            "maths":{"$numberInt":"80"}
            }
}

ReferenceField

MongoDB 文件可以使用這種型別的欄位儲存對另一個文件的引用。這樣,我們就可以像在 RDBMS 中一樣實現連線。ReferenceField 建構函式使用其他文件類的名稱作為引數。

class doc1(Document):
   field1=StringField()
class doc2(Document):
   field1=StringField()
   field2=ReferenceField(doc1)

在下面的示例中,StudentDB 資料庫包含兩個文件類:student 和 teacher。Student 類的文件包含對 teacher 類物件的引用。

from mongoengine import *
connect('studentDB')
class Teacher (Document):
   tid=StringField(required=True)
   name=StringField()
class Student(Document):
   sid = StringField(required=True)
   name = StringField()
   tid=ReferenceField(Teacher)

t1=Teacher()
t1.tid='T1'
t1.name='Murthy'
t1.save()

s1=Student()
s1.sid='S1'
s1.name='Mohan'
s1.tid=t1
s1.save()

執行上述程式碼並在 Compass GUI 中驗證結果。StudentDB 資料庫中將建立與兩個文件類對應的兩個集合。

新增的 teacher 文件如下:

{
"_id":{"$oid":"5ead627463976ea5159f3081"},
"tid":"T1",
"name":"Murthy"
}

student 文件的內容如下:

{
"_id":{"$oid":"5ead627463976ea5159f3082"},
"sid":"S1",
"name":"Mohan",
"tid":{"$oid":"5ead627463976ea5159f3081"}
}

請注意,Student 文件中的 ReferenceField 儲存相應 Teacher 文件的 _id。訪問時,Student 物件會自動轉換為引用,並在訪問相應的 Teacher 物件時取消引用。

要新增對正在定義的文件的引用,請使用“self”代替其他文件類作為 ReferenceField 的引數。需要注意的是,使用 ReferenceField 可能會導致文件檢索方面的效能下降。

ReferenceField 建構函式還有一個可選引數 reverse_delete_rule。其值決定了如果引用的文件被刪除該怎麼辦。

可能的值如下:

  • DO_NOTHING (0) - 什麼也不做(預設)。

  • NULLIFY (1) - 將引用更新為 null。

  • CASCADE (2) - 刪除與引用關聯的文件。

  • DENY (3) - 防止刪除引用物件。

  • PULL (4) - 從引用的 ListField 中刪除引用

您可以使用引用列表來實現一對多關係。假設一個 student 文件必須與一個或多個 teacher 文件相關聯,則 Student 類必須具有 ReferenceField 例項的 ListField。

from mongoengine import *
connect('studentDB')
class Teacher (Document):
tid=StringField(required=True)
name=StringField()
class Student(Document):
   sid = StringField(required=True)
   name = StringField()
   tid=ListField(ReferenceField(Teacher))
t1=Teacher()
t1.tid='T1'
t1.name='Murthy'
t1.save()
t2=Teacher()
t2.tid='T2'
t2.name='Saxena'
t2.save()
s1=Student()
s1.sid='S1'
s1.name='Mohan'
s1.tid=[t1,t2]
s1.save()

在 Compass 中驗證上述程式碼的結果後,您將發現 student 文件具有兩個 teacher 文件的引用:

Teacher Collection
{
"_id":{"$oid":"5eaebcb61ae527e0db6d15e4"},
"tid":"T1","name":"Murthy"
}
{
"_id":{"$oid":"5eaebcb61ae527e0db6d15e5"},
"tid":"T2","name":"Saxena"
}
Student collection
{
"_id":{"$oid":"5eaebcb61ae527e0db6d15e6"},
"sid":"S1","name":"Mohan",
"tid":[{"$oid":"5eaebcb61ae527e0db6d15e4"},{"$oid":"5eaebcb61ae527e0db6d15e5"}]
}

DateTimeField

DateTimeField 類的例項允許在 MongoDB 資料庫中使用日期格式的資料。MongoEngine 查詢 Python-DateUtil 庫來解析適當日期格式的資料。如果它在當前安裝中不可用,則日期將使用內建 time 模組的 time.strptime() 函式表示。此型別欄位的預設值為當前 datetime 例項。

DynamicField

此欄位可以處理不同型別的變化資料。此型別的欄位在內部由 DynamicDocument 類使用。

ImageField

此型別的欄位對應於文件中可以儲存影像檔案的欄位。此類的建構函式可以接受 size 和 thumbnail_size 引數(均以畫素大小表示)。

廣告
© . All rights reserved.