django的mysql數據模型的詳細操作(5)

第一步安裝mysql

Ubuntu上安裝MySQL非常簡單只需要幾條命令就可以完成。

1. sudo apt-get install mysql-server

2. apt-get isntall mysql-client

3. sudo apt-get install libmysqlclient-dev

安裝過程中會提示設置密碼什麼的,注意設置了不要忘了,安裝完成之後可以使用如下命令來檢查是否安裝成功:

sudo netstat -tap | grep mysql

通過上述命令檢查之後,如果看到有mysql 的socket處於 listen 狀態則表示安裝成功。

登陸mysql數據庫可以通過如下命令:

mysql -u root -p

-u 表示選擇登陸的用戶名, -p 表示登陸的用戶密碼,上面命令輸入之後會提示輸入密碼,此時輸入密碼就可以登錄到mysql。
然後通過 show databases; 就可以查看當前的數據庫。
安裝完mysql後還有建立一個數據庫裝模型

#shanghu 是我下面要使用的數據庫
create database shanghu charset = utf8;

第二步加入模型

class Buyer(models.Model):
    bname = models.CharField(max_length=20, unique=True)
    bgender = models.NullBooleanField(default=None)
    bage = models.IntegerField(default=0)

    def __str__(self):
        return self.bname


class Account(models.Model):
    amoney = models.FloatField(default=100)
    ano = models.CharField(max_length=10, unique=True)
    apwd = models.CharField(max_length=6,default='111111')
    abuyer = models.OneToOneField(Buyer)

    def __str__(self):
        return self.ano


class Order(models.Model):
    # ono = models.AutoField(primary_key=True,default=1)
    odatetime = models.DateTimeField(auto_now_add=True)
    omoney = models.FloatField(default=0)
    omsg = models.CharField(max_length=200,null=True)
    obuyer = models.ForeignKey(Buyer)

    def __str__(self):
        return "Order{obuyer="+self.obuyer.bname+",omoney="+str(self.omoney)+"}"


class Goods(models.Model):
    gname = models.CharField(max_length=20, unique=True)
    gtype = models.CharField(max_length=10)
    gprice = models.FloatField(default=0)
    ginfo = models.TextField()
    gbuyers = models.ManyToManyField(Buyer)

    def __str__(self):
        return self.gname

編完模型後在工程目錄的__init__.py下添加

import pymysql
pymysql.install_as_MySQLdb()

還有修改setting.py裏的DATABASES

DATABASES = {
    'default': {
        # 數據庫引擎
        'ENGINE': 'django.db.backends.mysql',

        # 數據庫名稱
        'NAME': 'shanghu',

        # 賬號和密碼
        'USER': 'root',
        'PASSWORD': '123456',

        # IP和端口
        'HOST': 'localhost',
        'PORT': '3306'
    }
}

之後就鏈接數據庫了
安裝pymysql

pip install pymysql

最後就行數據遷移

 #生成遷移文件(在MyApp下的migrations包中,遷移不成功可以刪除掉裏面的文件)
python manage.py makemigrations
 #執行數據遷移
python mananger.py migrate

@在子應用目錄下的admin.py下注冊管理

class Buyeradmin(admin.ModelAdmin):
    def bgender(self):
        if self.bgender:
            return '男'
        else:
            return '女'
    bgender.short_description = 'sex'
    list_display = ('bid','bname',bgender,'bage')
    list_filter = ('bgender',)
    list_per_page = 3
 admin.site.register(Buyer,Buyeradmin)

@創建管理用戶

python manage.py createsuperuser

省略。。。。。。。。
@創建數據以便進行增減查改
在網站後臺建立,建完後再pychrm數據庫中科院查看到買家的ID和商品的ID
@增(買家根據商品id購買商品)
在工程目錄的urls.py下建立路由

#http://127.0.0.1:8000/buy/2/4/--2是買家id,4是商品id
url(r'^buy/(\d+)/(\d+)/', views.buy),

在子應用的views.py建立buy方法

#bid,gid分別是路由給的買家id和商品id
def buy(request,bid,gid):
    #獲取買家對象
    b = Buyer.objects.get(pk=bid)
    #獲取商品對象
    g =Goods.objects.get(pk=gid)
    #買家和商品生成關係
    g.gbuyers.add(b)
    #保存
    g.save()
    #new一個訂單對象
    o = Order()
    #訂單和買家生成關係
    o.obuyer = b
    #根據上面的商品生成訂單數據
    o.omoney = g.gprice
    o.omsg = g.gname
    o.save()
    return HttpResponse(b.bname+'購買了'+g.gname)

完成購買操作
@查詢(買家已購買的商品)
老樣子先添加路由

url(r'^search/(\d+)/', views.search),

創建方法

def search(request,bid):
    b = Buyer.objects.get(pk=bid)
    a = b.goods_set.all()
    ret =''
    for s in a:
        ret +=s.gname+';'
    if ret=='':
        ret="0個商品"

    return HttpResponse(b.bname+'購買了'+ret)

@刪除(刪除訂單中指定的買家id的商品)
添加路由

url(r'^dele/(\d+)/(\d+)/', views.dele),

創建方法

#記得導入Q的庫
def dele(request,bid,gid):
    b = Buyer.objects.get(pk=bid)
    g =Goods.objects.get(pk=gid)
    o =Order.objects.filter(Q(obuyer_id=bid)& Q(omsg=g.gname))
    o.delete()

    return HttpResponse(b.bname+'用戶下'+g.gname+'的訂單已經全部刪除')

完成刪除
@修改(主要修改用戶的密碼)
添加路由

url(r'^alter/(\d+)/(\d+)/', views.alter),

創建方法

def alter(request,bid,num):
    b =Buyer.objects.get(pk=bid)
    a =Account.objects.get(abuyer_id=bid)
    a.apwd=num
    a.save()
    return HttpResponse(b.bname+'用戶的密碼以成功修改成'+a.apwd)

完成修改
@總結
數據的操作重點在於數據的查找,查找不到數據談何修改
數據的查詢方法簡介

  • 語法
XXX.objects.all()//返回XXX對象的全部屬性
XXX.objects.get(k1=va,k2=v2)//返回符合條件的對象集合
#過濾器
XXX.objects.filter(條件語句)//返回符合條件的對象
XXX.objects.exclude(條件語句)//返回去除該條件的對象
  • 條件語句
#格式
1  屬性名=值(忽略大小寫)
2  屬性名__運算符=臨界值
#運算符
gt,gte//大於,大於等於
lt,lte//小於,小於等於
exact(恰好等於)startwith,enndwith,contains(開頭加i的話不區分大小寫)

ps:查詢可以進行二次篩選:

XXX.objects.filter(bage__ge=40).filter(bgender=1)
  • Q對象查詢(實現複雜的條件查詢)

ps:記得要導入Q的庫

#與
Q(條件語句)&Q(條件語句)
#或
Q(條件語句)|Q(條件語句)
#非
~Q(條件語句)

@表關係
三種關係

#一對一,外鍵持有
i_person = models.**OneToOneField**(Person, on_delete=models.SET_NULL, null=True)
#訪問格式:對象.模型類小寫
idcard = person.idcard
 #一對多,多的一方持有外鍵
 h_person = models.**ForeignKey**(Person, on_delete=models.PROTECT)
 #訪問格式:對象.模型類小寫_set
 hobbies = person.hobby_set
#多對多,任意一方持有
g_buyers = models.**ManyToManyField**(Buyer)
訪問格式
1 goods.g_buyers.add(buyer)
2 buyers = goods.g_buyers.all()
3 goods_list = buyer.goods_set.all()
  • on_delete的使用
    定義刪除對象時如何處理其級聯數據(其外鍵/關係字段指向的數據)
#可選值
models.CASCADE//默認值,默認刪除級聯數據,直接刪掉相關的,不提醒,不報錯
models.PROTECT//不存在級聯數據的時候允許刪除,當存在級聯數據的時候刪除會拋出保護異常
models.SET_NULL//級聯數據賦值爲空
models.SET_DEFAULT//前提是字段本身有默認值
models.SET()//刪除的時候重新動態指向一個實體    

@模型的繼承

  • 元信息:在模型的class中添加實現
class Meta:
    #Flower這個是隨意命名的,數據遷移後mysql數據庫中會顯示該名字的表單,有子類繼承後,添加數據會“骨肉分離”,就是Flower表單會截取包含它的屬性
    1 db_table = 'Flower'
    #使用這個的話,數據遷移後不會創建表單,不實現骨肉分離,一般常用這個,2選1
    2 ordering = ["-f_color"]
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章