第一步安裝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"]