Python_Django-2

Model

1.創建表
基本結構

from django.db import models

class userinfo(models.Model):
    name = models.CharField(max_length=30)
    email = models.EmailField()
    memo = models.TextField()
  • 字段
    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):
    - 小整數 -32768 ~ 32767

    PositiveSmallIntegerField(PositiveIntegerRelDbTypeMixin, IntegerField)
    - 正小整數 0 ~ 32767
    IntegerField(Field)
    - 整數列(有符號的) -2147483648 ~ 2147483647

    PositiveIntegerField(PositiveIntegerRelDbTypeMixin, IntegerField)
    - 正整數 0 ~ 2147483647

    BigIntegerField(IntegerField):
    - 長整型(有符號的) -9223372036854775808 ~ 9223372036854775807

    自定義無符號整數字段

    class UnsignedIntegerField(models.IntegerField):
        def db_type(self, connection):
            return 'integer UNSIGNED'
    
    PS: 返回值爲字段在數據庫中的屬性,Django字段默認的值爲:
        'AutoField': 'integer AUTO_INCREMENT',
        'BigAutoField': 'bigint AUTO_INCREMENT',
        'BinaryField': 'longblob',
        'BooleanField': 'bool',
        'CharField': 'varchar(%(max_length)s)',
        'CommaSeparatedIntegerField': 'varchar(%(max_length)s)',
        'DateField': 'date',
        'DateTimeField': 'datetime',
        'DecimalField': 'numeric(%(max_digits)s, %(decimal_places)s)',
        'DurationField': 'bigint',
        'FileField': 'varchar(%(max_length)s)',
        'FilePathField': 'varchar(%(max_length)s)',
        'FloatField': 'double precision',
        'IntegerField': 'integer',
        'BigIntegerField': 'bigint',
        'IPAddressField': 'char(15)',
        'GenericIPAddressField': 'char(39)',
        'NullBooleanField': 'bool',
        'OneToOneField': 'integer',
        'PositiveIntegerField': 'integer UNSIGNED',
        'PositiveSmallIntegerField': 'smallint UNSIGNED',
        'SlugField': 'varchar(%(max_length)s)',
        'SmallIntegerField': 'smallint',
        'TextField': 'longtext',
        'TimeField': 'time',
        'UUIDField': 'char(32)',
    

    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)
    - 二進制類型

  • 參數
    null 數據庫中字段是否可以爲空
    db_column 數據庫中字段的列名
    db_tablespace
    default 數據庫中字段的默認值
    primary_key 數據庫中字段是否爲主鍵
    db_index 數據庫中字段是否可以建立索引
    unique 數據庫中字段是否可以建立唯一索引
    unique_for_date 數據庫中字段【日期】部分是否可以建立唯一索引
    unique_for_month 數據庫中字段【月】部分是否可以建立唯一索引
    unique_for_year 數據庫中字段【年】部分是否可以建立唯一索引

    verbose_name Admin中顯示的字段名稱
    blank Admin中是否允許用戶輸入爲空
    editable Admin中是否可以編輯
    help_text Admin中該字段的提示信息
    choices Admin中顯示選擇框的內容,用不變動的數據放在內存中從而避免跨表操作
    如:gf = models.IntegerField(choices=[(0, ‘何穗’),(1, ‘大表姐’),],default=1)

    error_messages 自定義錯誤信息(字典類型),從而定製想要顯示的錯誤信息;
    字典健:null, blank, invalid, invalid_choice, unique, and unique_for_date
    如:{‘null’: “不能爲空.”, ‘invalid’: ‘格式錯誤’}

    validators 自定義錯誤驗證(列表類型),從而定製想要的驗證規則
    from django.core.validators import RegexValidator
    from django.core.validators import EmailValidator,URLValidator,DecimalValidator,\
    MaxLengthValidator,MinLengthValidator,MaxValueValidator,MinValueValidator
    如:
    test = models.CharField(
    max_length=32,
    error_messages={
    ‘c1’: ‘優先錯信息1’,
    ‘c2’: ‘優先錯信息2’,
    ‘c3’: ‘優先錯信息3’,
    },
    validators=[
    RegexValidator(regex=’root_\d+’, message=’錯誤了’, code=’c1’),
    RegexValidator(regex=’root_112233\d+’, message=’又錯誤了’, code=’c2’),
    EmailValidator(message=’又錯誤了’, code=’c3’), ]
    )

  • 原信息
class UserInfo(models.Model):
        nid = models.AutoField(primary_key=True)
        username = models.CharField(max_length=32)
        class Meta:
            # 數據庫中生成的表名稱 默認 app名稱 + 下劃線 + 類名
            db_table = "table_name"

            # 聯合索引
            index_together = [
                ("pub_date", "deadline"),
            ]

            # 聯合唯一索引
            unique_together = (("driver", "restaurant"),)

            # admin中顯示的表名稱
            verbose_name

            # verbose_name加s
            verbose_name_plural

    更多:https://docs.djangoproject.com/en/1.10/ref/models/options/

連表結構
- 一對多:models.ForeignKey(其他表)
- 多對多:models.ManyToManyField(其他表)
- 一對一:models.OneToOneField(其他表)

2.操作表
基本操作:

# 增
    #
    # 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()                                                 # 修改單條數據

進階操作

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

        # 大於,小於
        #
        # models.Tb1.objects.filter(id__gt=1)              # 獲取id大於1的值
        # models.Tb1.objects.filter(id__gte=1)              # 獲取id大於等於1的值
        # models.Tb1.objects.filter(id__lt=10)             # 獲取id小於10的值
        # models.Tb1.objects.filter(id__lte=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等於112233的數據
        # models.Tb1.objects.exclude(id__in=[11, 22, 33])  # not in

        # isnull
        # Entry.objects.filter(pub_date__isnull=True)

        # 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

        # 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"

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

        # regex正則匹配,iregex 不區分大小寫
        #
        # Entry.objects.get(title__regex=r'^(An?|The) +')
        # Entry.objects.get(title__iregex=r'^(an?|the) +')

        # date
        #
        # Entry.objects.filter(pub_date__date=datetime.date(2005, 1, 1))
        # Entry.objects.filter(pub_date__date__gt=datetime.date(2005, 1, 1))

        # year
        #
        # Entry.objects.filter(pub_date__year=2005)
        # Entry.objects.filter(pub_date__year__gte=2005)

        # month
        #
        # Entry.objects.filter(pub_date__month=12)
        # Entry.objects.filter(pub_date__month__gte=6)

        # day
        #
        # Entry.objects.filter(pub_date__day=3)
        # Entry.objects.filter(pub_date__day__gte=3)

        # week_day
        #
        # Entry.objects.filter(pub_date__week_day=2)
        # Entry.objects.filter(pub_date__week_day__gte=2)

        # hour
        #
        # Event.objects.filter(timestamp__hour=23)
        # Event.objects.filter(time__hour=5)
        # Event.objects.filter(timestamp__hour__gte=12)

        # minute
        #
        # Event.objects.filter(timestamp__minute=29)
        # Event.objects.filter(time__minute=46)
        # Event.objects.filter(timestamp__minute__gte=29)

        # second
        #
        # Event.objects.filter(timestamp__second=31)
        # Event.objects.filter(time__second=2)
        # Event.objects.filter(timestamp__second__gte=31)

其他操作:

# extra
    #
    # extra(self, select=None, where=None, params=None, tables=None, order_by=None, select_params=None)
    #    Entry.objects.extra(select={'new_id': "select col from sometable where othercol > %s"}, select_params=(1,))
    #    Entry.objects.extra(where=['headline=%s'], params=['Lennon'])
    #    Entry.objects.extra(where=["foo='a' OR bar = 'a'", "baz = 'a'"])
    #    Entry.objects.extra(select={'new_id': "select id from tb where id > %s"}, select_params=(1,), order_by=['-nid'])

    # F
    #
    # from django.db.models import F
    # models.Tb1.objects.update(num=F('num')+1)


    # Q
    #
    # 方式一:
    # Q(nid__gt=10)
    # Q(nid=8) | Q(nid__gt=10)
    # Q(Q(nid=8) | Q(nid__gt=10)) & Q(caption='root')
    # 方式二:
    # 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)


    # 執行原生SQL
    #
    # from django.db import connection, connections
    # cursor = connection.cursor()  # cursor = connections['default'].cursor()
    # cursor.execute("""SELECT * from auth_user where id = %s""", [1])
    # row = cursor.fetchone()
發佈了51 篇原創文章 · 獲贊 10 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章