Django Model基礎操做

關於設計django model

django爲咱們集成了ORM對數據庫進行操做,咱們只須要進行定義model,django就會自動爲咱們建立表,以及表之間的關聯關係html

建立好一個django項目-首先在setting.py中配置你要使用的數據前端

1.再settings.py中添加你的app

#django自帶的是sqlite3
#下面是自帶的django 數據庫設置
DATABASES = {
'default': {
    'ENGINE': 'django.db.backends.sqlite3',
    'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}

若是要想要使用mysql做爲你的數據庫python

DATABASES = {
     'default': {
     'ENGINE': 'django.db.backends.mysql',
     'NAME':'庫名稱',
     'USER': '用戶名',
     'PASSWORD': '密碼',
     'HOST': '主機地址',
     'PORT': '端口',
     }
 }

django關於數據庫部分:https://docs.djangoproject.com/en/1.10/ref/settings/#databasesmysql

注意

在python3.x中鏈接mysql 
   - MySqlDB   (python2.x)
   - pymysql   (python3.x)
在settings配置目錄的init.py中:
    import pymysql
    pymysql.install_as_MySQLdb()

1.定義表結構---建立一個類sql

類   --> 數據庫的表
字段 --> 列
對象 --> 一行數據
from django.db import models
class UserInfo(models.Model):
    #設置自增加主鍵-若是不設置默認django會生成id列 爲主鍵
    nid = models.AutoField(primary_key=True)
    #定義爲字符,最大長度爲32
    username = models.CharField(max_length=32)
    pwd = models.CharField(max_length=64)
    #定義爲數字類型,
    age = models.IntegerField()

經常使用的model中的類型數據庫

models.CharField        #字符類型
models.TextField        #文本框類型
models.IntegerField     #整型
models.BooleanField     #布爾型
models.AutoField        #自動增加
models.DateTimeField    #時間
models.DateField        #日期
models.EmailField       #郵箱
models.IPAddressField   #IP地址
models.ImageField       #圖片
models.FileField        #文件
models.FilePathField    #文件路徑
models.URLField         #URL類型

2.當咱們設計完表結構之後,根據app的models.py生成數據庫表django

--執行下面的命令在數據庫中生成對應的表
    
    python manage.py makemigrations
    python manage.py migrate

3.數據庫基本操做python3.x

當咱們在view視圖函數中須要處理數據的時候,app

注意:model裏定義的大寫-在調用的時候都是小寫
    a. 查
        models.userinfo.objects.all()     #獲取表中全部的數據tb(表)
        models.userinfo.objects.filter(nid=1)
        models.userinfo.objects.filter(nid=1).first() #若是不存在會返回None
        models.userinfo.objects.values()        #返回一個字典格式的
        models.userinfo.objects.value_list()    #返回一個列表格式
    
    b. 增
        models.userinfo.objects.create(...)   #添加數據的方式一
        
        obj = models.userinfo(...)            #添加數據方式二
        obj.save()
    c. 刪
        models.userinfo.objects.all().delete()    #刪除全部的數據
        models.userinfo.objects.filter(nid=1).delete()    #刪除nid=1的數據
    d. 改
        models.userinfo.objects.all().update(...) #更新全部的數據
        models.userinfo.objects.filter(nid=1).update(...) #更新nid=1的數據

django_model高級部分

咱們先作一個準備工做函數

# 1.建立表
#定義一個部分表
class DePart(models.Model):
    title = models.CharField(max_length=16)
#用戶表
class UserInfo(models.Model):
    username = models.CharField(max_length=32)
    password = models.CharField(max_length=64)
    #用戶是屬於某一個部分的-是一對多的關係(一個部門對應多個用戶)
    dp = models.ForeignKey(to="DePart",to_field="id",null=True,on_delete=models.SET_NULL)
    #用戶是能夠屬於多個用戶組-是多對多的關係(一個用戶可對應多個組,一個組裏也能夠有多個用戶) 這個manytomany 也能夠放到用戶組中   -自動建立表(userinfo_gp)
    gp = models.ManyToManyField('group')
#用戶組表
class Group(models.Model):
    groupname = models.CharField(max_length=32)

咱們來講一下表之間的關聯關係

- 一對多關係(ForeignKey)
    經過對to='表名' to_field='要關聯表的字段'設置進行一對多的關係
- 多對多關係(ManyToManyField)
    一種是用django自帶的ManytoManyField,會自動建立一張userinfo_gp表(id,foreinkey,foreinkey)-維護對應關係
    一張是本身建立一個表進行維護,好處是列的數量能夠本身定義
- 一對一關係(OneToOneField)

#經過view.py文件,建立對應的數據
views:

def test(request):
  models.DePart.objects.create(title='IT')
  models.DePart.objects.create(title='諮詢')
  models.DePart.objects.create(title='公關')
 
  models.UserInfo.objects.create(username='alex',password='123',dp_id=1)
  models.UserInfo.objects.create(username='eric',password='123',dp_id=1)

下面進入咱們關鍵的查詢部分

  1. 外鍵查詢---ForeignKey-----

(正向)跨表操做: 由包含ForeignKey的表查詢另外一張表的內容,獲取外鍵關聯表的內容

格式:

  • obj.表名.列名
  • obj.表名_列名

    # 1.獲取對象 跨表查詢1 
      # 經過all獲取到的是一個列表形式[obj,obj,obj]
      # q=models.UserInfo.objects.all()
      # for row in q:
      #     print(row.username,row.password,row.dp_id,row.dp.id,row.dp.title,row.dp)
    
      # 2. 字典 跨表查詢2
      # 經過values獲取到的是一個字典形式
      # q=models.UserInfo.objects.values('username','password','dp_id','dp__title')
      # for row in q:
      #     print(row.username,row.password,row.dp_id,row.dp.id,row.dp.title,row.dp)
    
      # 3.元組 跨表查詢3
      # 經過value_list獲取到一個列表-元組的格式[(),(),()]
      # q=models.UserInfo.objects.values_list('username','password','dp_id','dp__title')
      # for row in q:
      #     print(row)
      #     print(row[0],row[3])

(反向)跨表 ,自己表內沒有外鍵存在...但對方表中使用了該表作外鍵

格式

  • obj.表名_set.列名
  • obj.表名__列名
  • obj.表名_set.all()

若是正向的表中設置了related_name=‘xxx’

  • obj.xxx_set.列名

    #兩種操做類型,userinfo_set   和 userinfo__
      #1.對象
      # v=models.DePart.objects.all()
      # for row in v:
      #     print(row.id,row.title,row.userinfo_set.all())
      #2.字典
      # v=models.DePart.objects.values('id','title','userinfo__password','userinfo__password')
      # for row in v:
      #     print(row)
      #3.元組
      # v=models.DePart.objects.values_list('id','title','userinfo__username','userinfo__password')
      # for row in v:
      #     print(row)

2.多對多查詢 ---ManyToManyField---

  • 若是是本身建立的表,就直接對本身建立的第三張表進行操做。
  • 經過ORM根據ManyToManyField字段生成的表進行操做

    userinfo_obj=models.UserInfo.objects.filter(id=1).first()   #查找用戶ID爲1的數據
      # 1.添加數據的方式
      # userinfo_obj.m.add(1)              #添加用戶ID爲1,組ID爲1 的
      # userinfo_obj.m.add(2,3,4)           #添加用戶ID爲1,組ID爲2,3,4 的
      # userinfo_obj.m.add(*[1,2])
    
      # 2.刪除數據的方式
      # userinfo_obj.m.remove(1)
      # userinfo_obj.m.remove(2,3)
      # userinfo_obj.m.remove(*[1,])
    
      # 3.清除數據
      # userinfo_obj.m.clear()       #清楚用戶ID爲1 的全部組數據
    
      #至關於更新操做,將全部的數據清除,再添加1,2
      # userinfo_obj.gp.set([1,2,])
      # q=userinfo_obj.gp.all()   #獲取用戶組的信息
      # print(q)
    
      #創建在上一次查詢基礎上,再次作二次篩選
      q = userinfo_obj.gp.filter(id__gt=1)
      print(q)
      return HttpResponse('123')
      前端展現:

    關於ManyToMany字段:

    操做:
          表設計
          class Ip(models.Model):
              '''全部IP地址'''
              ip = models.GenericIPAddressField(null=True)
              item = models.ForeignKey('Item')
              platform = models.ForeignKey('Platform',null=False)
              m_port = models.ManyToManyField('Port')
          class Port(models.Model):
              port = models.IntegerField()
              comment = models.CharField(max_length=64,null=True,blank=True)
              def __str__(self):
                  return str(self.port)
          views:
    
              all_ip = models.Ip.objects.all()
              # for i in all_ip:
              #     print(i.m_port.all())
              return render(request, 'ip_list.html',locals())
          前端展現:
               {% for ip_obj in all_ip %}
              <td>{% for port in ip_obj.m_port.all %}{{ port.port }},{% endfor %}</td>
              {% endfor %}

後續增長ORM操做內容

ORM 建立表

  • FK經常使用操做

    class A(Model):
          name = models.CharField(....)
    
      class B(Model):
          name = models.Charfild(...)
          fk = models.FK(A)
    • B表中有幾列

      id
        name
        fk_id
    • a.跨表操做

      b_list = models.B.objects.all()
        for item in b_list:
            item.id
            item.name
            item.fk_id
            item.fk
            item.fk.name
            item.k.id
    • b.跨表操做

      b_list = models.B.objects.values("id","name","fk_id","fk__name")
        for item in b_list:
            item["id"]
            item["name"]
            item["fk_id"]
            item["fk__name"]
    • c.跨表操做

      b_list = models.B.objects.value_list("id","name","fk_id","fk__name")
        for item in b_list:
            item[0]
            item[1]
            item[2]
            item[3]
    • d.跨表操做

      models.B.objects.filter(fk__name="李鵬飛")
  • M2M 經常使用操做

    class A(Model):
          name = models.CharField(....)
    
      class B(Model):
          name = models.Charfild(...)
          m = models.M2M(A)
    • a. B表中有幾列
      id
      name

      PS: 自動生成一個第三張表:m 用於間接的對第三張表進行操做
    • b. 在B表中插入三條數據: A表中插入2條數據
      models.A.objects.create(name="張")
      models.A.objects.create(name="三")
      models.A.objects.create(name="豐")

      models.B.objects.create(name="興普")
        models.B.objects.create(name="香香")
        models.B.objects.create(name="皮皮")
    • c. 興普和【張,三,豐】建立關係

      obj = models.B.objects.create(name="興普")
        obj.m.add(1)
        obj.m.add(2)
        obj.m.add(*[1,2,3])
    • d. 查找和興普有關係的人?

      obj = models.B.objects.create(name="興普")
        obj.m.all() [A-obj,A-obj]
相關文章
相關標籤/搜索