1. 程式人生 > >python學習筆記(92) Django基礎之ORM

python學習筆記(92) Django基礎之ORM

models back efi engine all 信息 記錄 super bin

1. ORM已經的學過的內容:
  1. 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)

        def __str__(self):
        return self.title
    5. 執行兩條命令
      1. 在哪兒執行?
      在項目的根目錄(有manage.py文件的那個目錄)
      2. 命令
      python manage.py makemigrations --> 將models.py文件中的改動記錄在小本本(app/migrations/00xx_****.py)上

      python manage.py migrate --> 將改動翻譯成SQL語句,去數據庫中執行
  2. 表和表之間的關系
    1. 一對多(出版社和書)
    publisher = models.ForeignKey(to="Publisher")

    在數據庫中:
    有沒有publisher這個字段?
    數據庫中實際 生成的是一個 publisher_id 字段

    2. 多對多(作者和書)
    books = models.ManyToManyField(to="Book") # 這個models是Django內置模塊

    在數據庫中:
    是通過第三張表建立的關系

    3. 增刪改查操作
      1. 單表增刪改查
      增:
        models.Publisher.objects.create(name="沙河出版社") # 這個models是models.py
      查:
        models.Publisher.objects.get(id=1)
        models.Publisher.objects.get(name="沙河出版社")
      刪:
        models.Publisher.objects.get(id=1).delete()
      改:
        obj = models.Publisher.objects.get(id=1)
        obj.name = "沙河第二出版社"
        obj.save()
      2. 外鍵的增刪改查
      增、刪、查同上

        book_obj = models.Book.objects.get(id=1)

        book_obj.publisher 是什麽? *****
        和我這本書關聯的出版社對象

        book_obj.publisher.id 和我這本書關聯的出版社的id值
        book_obj.publisher.name 和我這本書關聯的出版社的名稱

        book_obj.publisher_id 是什麽?
        和我這本書關聯的出版社的id值

      3. 多對多操作

        1. 查id為1的作者都寫過的書?
          author_obj = models.Author.objects.get(id=1)
          author_obj.books.all() --> 和我這個作者關聯的所有書對象
        2. 想給作者綁定多本書?
          author_obj = models.Author.objects.get(id=1)
          author_obj.books.set([1,2,3]) --> 把id是1、2、3的書和我這個作者關聯上

    反射本地文件的類:
      if hasattr(sys.modules[__name__], "Person"):
      class_name = getattr(sys.modules[__name__], "Person")

#####################################################

ORM: Object Relational Mapping 對象關系映射

1. Django ORM常用字段:
  1. AutoField --> 自增
  2. CharField --> varchar(xx) 必須指定max_length
  3. ForeignKey --> 外鍵
  4. ManyToManyField --> 多對多關聯

  5. DateField
  6. DateTimeField # 相當於DateField加了Time
    auto_now_add=Ture # 生成時把當前時間填入
    auto_now=Ture # 修改時把當前時間填入

  7. IntegerField # 長度不夠存手機號,用CharField


2. 自定義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



3. 常用的字段參數
  1. null # 可以為空
  2. default
  3. unique
  4. db_index # 建立索引

  5. DateField和DateTimeField才有的參數:
    auto_now_add=True --> 創建數據的時候自動把當前時間賦值
    auto_add=True --> 每次更新數據的時候更新當前時間

    上述兩個不能同時設置!!!

  6. class Meta: # 寫在類內部
    db_table = "表名" # 指定表名(不要app01_person)
  7. to # 要關聯的表
  8. to_field # 指定要關聯表的字段
  9. db_constraint=False # 外鍵軟關聯
4. 字段合集:

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

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






python學習筆記(92) Django基礎之ORM