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