python ORM 模塊peewee(三): Model的建立


首先,需要理清一下python數據與數據庫數據是怎么對應的:

  • Model類:表
  • Field類:表上的列的類型
  • Model實例:表上的一行數據

1. Model Class主要描述的是數據表以及其繼承的順序

這里主要是需要對Model類中的Meta類的定義規范進行小結:

  1. 當Meta類建立后,不應該通過mymodel.Meta來進行訪問,而應該使用mymodel._meta, 這是一個ModelOption類的實例, 可以通過它獲取model和Meta的一些屬性
  2. Meta的可用屬性有:

    除了db_tabletable_alias之外,其他的字段均可以被繼承
    可以看到,peewee的主鍵,索引和其他約束均可以在meta中定義。
  3. 主鍵的定義
class mymodel1(Model):
    name = CharField(max_length=200, primary_key=True) #將該字段設為主鍵

class mymodel2(Model):
    name = CharField(max_length=200)
    Meta:
        # 如果要不使用主鍵
        primary_key = False

class mymodel3(Model):
    blog = ForeignKeyField(Blog)
    tag = ForeignKeyField(Tag)

    class Meta:
        primary_key = CompositeKey('blog', 'tag') # primary_key實際上是CompositeKey的一個實例

非整型的主鍵
當主鍵為非auto_increment時,插入數據調用save()會出錯,應該調用save(force_insert=True)

  1. 添加索引
    單列索引
    多列索引

2. Field Class主要描述python數據類型與數據庫數據類型的對應關系和數據表之間的關系(外鍵,多對多)

Filed在peewee.py中有基本數據類型的定義
# 初始化函數,各個字段的默認值
def __init__(self, null=False, index=False, unique=False,
                 verbose_name=None, help_text=None, db_column=None,
                 default=None, choices=None, primary_key=False, sequence=None,
                 constraints=None, schema=None)

在playhouse.fields中定義的額外字段

包括

    PasswordField
    ManyToManyField
    CompressedField
    PickledField
    AESEncryptedField

然而peewee中並不推薦使用這些Field, 例如ManyToManyField,完全可以用一個含兩個外鍵的關系表來維護,ManyToMany關系在ORM中實際上也正是這樣來實現的,並且使用這種方式可以描述更加復雜的關系。

自定義field字段
# 1. 定義MyField類
class MyField(Field):
    # Field的標簽
    db_field = 'my'
    
    # 返回數據庫類型的值
    def db_value(value):
        pass

    # 返回python類型的值
    def python_value(value):
        pass

# 2. 將自定義Field子類與數據表中的列關聯,有兩種方法:
#     1. 創建數據庫時,給fields字段賦值
db = MySQLDatabase('my_db', fields={'my': 'my'})
#     2. 調用register_fields函數
db.register_fields({'my':'my'})


免責聲明!

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



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