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"]

猜你喜欢

转载自blog.csdn.net/qq_39222965/article/details/80456212