Django Orm 經常使用字段和參數

ORM 對象關係映射html

Django中的ormpython

第一步:先在Django項目的settings.py文件中,配置數據庫鏈接信息mysql

DATABASES = {
    "default": {
        "ENGINE": "django.db.backends.mysql",
        "NAME": "你的數據庫名稱",  # 須要本身手動建立數據庫
        "USER": "數據庫用戶名",
        "PASSWORD": "數據庫密碼",
        "HOST": "數據庫IP",
        "POST": 3306
    }
}

第二步:在Django項目的__init__.py文件中寫以下代碼,告訴Django使用pymysql模塊連接的數據庫git

import pymysql

pymysql.install_as_MySQLdb()

modelsql

說明:數據庫

  1.表名是自動生成的,若是要自定義表名:django

  

class Author(models.Model):
    name=models.CharField(max_length=32)
    books=models.ManyToManyField(to='Book',db_table='author2book')#多對多創建關係時生成第三張表自定義表名
    class Meta:
        db_table = 'author'#自定義表名

  2.id字段是自動添加的,若是你想要指定自定義主鍵,只需在其中一個字段中指定primary_key=True便可。若是Django發現你已經明確地設置了Field.primary_key,它將不會添加自動id列。後端

  3.Django會根據配置文件中指定的數據庫後端類型來生成相應的SQL語句app

  4.Django支持MySQL5.5及更高版本spa

Django ORM通常操做

all()查詢全部結果

 

    ret=models.Book.objects.all()
    print(ret)#<QuerySet [<Book: 我是小三>, <Book: 渣男是怎樣練成的>, <Book: 番茄的十種作法>]>

 

filter(**kwargs)它包含了與所給篩選條件相匹配的對象

    ret=models.Publisher.objects.filter(id=1)
    print(ret)#<QuerySet [<Publisher: 我是垃圾出版社>]>

get(**kwargs)返回與所給篩選條件相匹配的對象,返回結果有且只有一個,若是符合篩選條件的對象超過一個或者沒有就會拋出錯誤

    ret = models.Publisher.objects.get(id=1)
    print(ret)#我是垃圾出版社
    ret = models.Publisher.objects.get(name='我是垃圾出版社')
    print(ret)#app01.models.MultipleObjectsReturned: get() returned more than one Publisher -- it returned 2!

exclude(**kwargs)它包含了與所給篩選條件不匹配的對象

    ret = models.Publisher.objects.exclude(id=1)
    print(ret)#<QuerySet [<Publisher: 超神出版社>]>

values(*field)返回一個ValueQuerySet一個特殊的QuerySet,運行後獲得的並非一系列model的實例化對象,而是一個可迭代的字典序列

    ret = models.Publisher.objects.values()
    print(ret)#<QuerySet [{'id': 1, 'name': '我是垃圾出版社', 'city': '上海'}, {'id': 2, 'name': '超神出版社', 'city': '北京'}]>
    print(ret[0])#{'id': 1, 'name': '我是垃圾出版社', 'city': '上海'}
    print(ret[0]['name'])#我是垃圾出版社
    ret1 = models.Publisher.objects.values('id','name')
    print(ret1)#<QuerySet [{'id': 1, 'name': '我是垃圾出版社'}, {'id': 2, 'name': '超神出版社'}]>

values_list(*field)它與values()很是類似,它返回的是一個元組序列,values返回的是一個字典序列

    ret = models.Publisher.objects.values_list()
    print(ret)#<QuerySet [(1, '我是垃圾出版社', '上海'), (2, '超神出版社', '北京')]>
    print(ret[0])#(1, '我是垃圾出版社', '上海')
    print(ret[0][1])#我是垃圾出版社
    ret1 =  models.Publisher.objects.values_list('id','name')
    print(ret1)#<QuerySet [(1, '我是垃圾出版社'), (2, '超神出版社')]>

order_by(*field)對查詢結果排序

    from app01 import models
    ret = models.Book.objects.order_by('title')
    print(ret)#<QuerySet [<Book: 我是小三>, <Book: 未成年心理學>, <Book: 渣男是怎樣練成的>, <Book: 番茄的十種作法>]>
    ret1 = models.Book.objects.order_by('price')
    print(ret1)#<QuerySet [<Book: 番茄的十種作法>, <Book: 未成年心理學>, <Book: 渣男是怎樣練成的>, <Book: 我是小三>]>默認升序

reverse()對查詢結果反向排序,請注意reverse()一般只能在具備已定義順序的QuerySet上調用(在model類的Meta中指定ordering或調用order_by()方法)

    from app01 import models
    ret = models.Book.objects.order_by('title').reverse()
    print(ret)#<QuerySet [<Book: 番茄的十種作法>, <Book: 渣男是怎樣練成的>, <Book: 未成年心理學>, <Book: 我是小三>]>
    ret1 = models.Book.objects.order_by('price').reverse()
    print(ret1)#<QuerySet [<Book: 我是小三>, <Book: 渣男是怎樣練成的>, <Book: 未成年心理學>, <Book: 番茄的十種作法>]>

distinct()去重

    ret4 = models.Book.objects.filter(Q(author__name='西方不敗')|Q(author__name='垃圾東瀛')).distinct()
    print(ret4)

count()返回數據庫中匹配查詢(QuerySet)的對象數量

    from app01 import models
    ret = models.Book.objects.filter(title__icontains='').count()
    print(ret)#2

first()返回第一條記錄

    from app01 import models
    ret = models.Book.objects.first()
    print(ret)#我是小三

last()返回最後一條記錄

    from app01 import models
    ret = models.Book.objects.last()
    print(ret)#未成年心理學

exists()若是QuerySet包含數據,就返回True,不然返回Flase

    from app01 import models
    ret = models.Author.objects.exists()
    print(ret)#True

 

Django ORM 經常使用字段和參數

經常使用字段

AutoField

int自增列,必須填入參數primary_key=True。若是沒有自增列會自動生成一個id自增列

from django.db import models

class User(models.Model):
    id=models.AutoField(primary_key=True)
    name=models.CharField(max_length=16)

class Publisher(models.Model):
  #沒有自增列 會自動增長id自增列 name
= models.CharField(max_length=32)

 

IntegerField

一個整數類型,-2147483648 to 2147483647

由於整數類型只有十位因此手機號 證件號之類的都不能夠用它來存

CharField

字符類型,必須提供max_length參數,max_length表示字符長度

 

class Author(models.Model):
    name = models.CharField(max_length=32)

 

字符類型至關於數據庫裏的varchar類型

咱們能夠自定義一個char

class zhangxiangyucharField(models.Field):
    def __init__(self,max_length,*args,**kwargs):
        self.max_length=max_length
        super().__init__(max_length=max_length,*args,**kwargs)

    def db_type(self,connection):
        return 'char(%s)'%self.max_length

DateField

日期字段,日期格式 YYYY-MM-DD,至關於python中的datetime.date()實例

class Book(models.Model):
    title = models.CharField(max_length=32)
    publish_date = models.DateField(auto_now_add=True)
#auto_now_add添加值的時候時間就固定了,而auto_now每次改變值的時候都會更新一次時間  

DateTimeField

日期時間字段,格式YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ],至關於python中的datetime.datetime()實例

 

字段合集(爭取記憶)

https://www.cnblogs.com/liwenzhou/p/8688919.html

 orm字段和數據庫實際字段的對應關係

字段參數

null

用於表示某個字段能夠爲空

class Publisher(models.Model):
    name=models.CharField(max_length=32,null=True)

unique

若是設置爲unique=True 則該字段在此表中必須是惟一的

 

class Publisher(models.Model):
    name=models.CharField(max_length=32,unique=True)

db_index

若是db_index=True則表明着爲此字段設置索引

defaul

爲該字段設置默認值

class Publisher(models.Model):
    name=models.CharField(max_length=32,default='張相玉帥哥')

 

關係字段

ForeignKey

外鍵類型在ORM中用來表示外鍵關聯關係,通常把ForeignKey字段設置在'一對多'中'多'的一方

ForeignKey能夠和其餘表作關聯關係同時也能夠和自身作關聯關係

to

設置要關聯的表

to_field

設置要關聯的表的字段

related_name

反向操做時,使用的字段名,用於代替原反向查詢時的'表名_set'。

related_query_name

反向查詢操做時,使用的鏈接前綴,用於替換表名

from django.db import models

# Create your models here.

class Book(models.Model):
    title = models.CharField(max_length=32)
    publish_date = models.DateField(auto_now_add=True)
    price = models.DecimalField(max_digits=5, decimal_places=2)
    # 建立外鍵,關聯publish
    publisher = models.ForeignKey(to="Publisher" ,related_name='books',related_query_name='zhangshuaige')
    # 建立多對多關聯author
    author = models.ManyToManyField(to="Author")

    def __str__(self):
        return self.title
import os

if __name__ == '__main__':
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "xianzai.settings")
    import django
    django.setup()
    from app01 import models

    publisher_obj=models.Publisher.objects.first()
    若是設置了related_name='books'
    ret=publisher_obj.books.all()
    print(ret[0])

    #若是設置了 related_query_name='zhangshuaige'
    ret=models.Publisher.objects.filter(id=1).values('zhangshuaige__title')
    print(ret)

on_delete

當刪除關聯表中的數據時,當前表與其關聯的行的行爲

OneToOneField

一對一字段

一般一對一字段用來擴展已有字段。

to 設置要關聯的表

to_field 設置要關聯的字段

on_delete

 

ManyToManyField

用於表示多對多的關聯關係。在數據庫中經過第三張表來創建關聯關係

to related_name  related_query_name 同ForeignKey字段

through

設置第三張表的表名

class Author(models.Model):
    name=models.CharField(max_length=32)
    books=models.ManyToManyField(
        to='Book',
        through='Book2Author',
        through_fields=('author','book')
    )

 

through_fields

設置關聯的字段

db_table

默認建立第三張表時,數據庫中表的名稱

相關文章
相關標籤/搜索