django-mysql 表关联操作数据库,实现增删改查功能

 

 

相关网址:https://www.cnblogs.com/yangmv/p/5327477.html

相关网址:https://www.cnblogs.com/PythonHomePage/p/7634394.html

django-ajax相关网址:https://www.cnblogs.com/yjq520/p/9024767.html

刘江: http://www.liujiangblog.com/course/django/130

我得开发过程bug:  https://mp.csdn.net/postedit/85156355

 

表关联分3种:

  1. 一对一:models.OneToOneField(其他表)

  2. 一对多:models.ForeignKey(其他表)

  3. 多对多:models.ManyToManyField(其他表)

 

一对多:一旦确定一对多的关系,在多的一方(book)创建关联字段publish_id

多对多:一旦确定多对多的关系,创建第三张表,比如Author2Book表,字段分别是id,Book_id, Author_id

一对一:两张表其实就是一张表,在任意一张表创建关联字段

 

一、一对一

 

 

二、一对多

增

models.UserInfo.objects.create(user='yangmv',pwd='123456')

或者

obj = models.UserInfo(user='yangmv',pwd='123456')

obj.save()

或者

dic = {'user':'yangmv','pwd':'123456'}

models.UserInfo.objects.create(**dic)



删

models.UserInfo.objects.filter(user='yangmv').delete()



改

models.UserInfo.objects.filter(user='yangmv').update(pwd='520')

models.Article.objects.filter(id=id).update(title=title, content=content) # 同时改多个

或者

obj = models.UserInfo.objects.get(user='yangmv')

obj.pwd = '520'

obj.save()



查

models.UserInfo.objects.all()

models.UserInfo.objects.all().values('user')            #只取user列

models.UserInfo.objects.all().values_list('id','user')    #取出id和user列,并生成一个列表

models.UserInfo.objects.get(id=1)

models.UserInfo.objects.get(user='yangmv')


#全匹配

publish_date = request.POST.get("publish_date")

update_time = request.POST.get("update_time")

search_dict = dict()

if publish_date:

    search_dict['publish_date'] = publish_date

if update_time:

    search_dict['update_time'] = update_time

search_sql = models.Article.objects.filter(**search_dict)


# 全匹配 + 模糊匹配

search_sql = models.Article.objects.filter(**search_dict).filter(title__contains=title).filter(content__contains=content)

# 示例:查询a表中id大于4,以‘张’开头,或者价格大于10000的数据

from django.db.models import Q

a.objects.filter((Q(name__startwith='张'),Q(id__gt=4))|Q(price__gt=10000))

案例:

# -*-  coding:utf-8 -*-
from django.shortcuts import render
from django.http import HttpResponse
from django.core import serializers
import json
from proApp import models, base
from proApp.commonimport DateEncoder, Datagrid

@base.checkLogin
def index(request):
    return render(request,"author.html")

# 查
def getAuthor(request):
    if request.method == "GET":
        page = int(request.GET.get('page',''))-1
        rows = int(request.GET.get('rows',''))
        list = models.Author.objects.all().order_by("-id")
        allList = []
        for li in list:
            allList.append({
                "id": li.id,
                "name": li.name,
                "email": li.email,
                "sex": li.sex,
                "depart": li.depart_id,
                "phone": li.phone,
                "account": li.account,
                "publish_date": json.loads(json.dumps(li.publish_date, cls=DateEncoder)),
            })
        total = len(allList)
        p = Datagrid()
        json_data_list = p.page(page, rows, total, allList)
        return HttpResponse(json.dumps(json_data_list), content_type='application/json; charset=utf-8')

    if request.method == "POST":
        page = int(request.POST.get('page', '')) - 1
        rows = int(request.POST.get('rows', ''))
        name = request.POST.get("name", '')
        sex = request.POST.get("sex")
        depart = request.POST.get("depart")
        dateFrom = request.POST.get("dateFrom")
        dateTo = request.POST.get("dateTo")
        # 定一个字典用于保存前端发送过来的查询条件
        search_dict = dict()
        if dateFrom:
            search_sql = models.Author.objects.filter(publish_date__gte=dateFrom)
        else:
            search_sql = models.Author.objects

        if dateTo:
            search_sql = search_sql.filter(publish_date__lte=dateTo)

        if int(sex)>-1:
            search_sql = search_sql.filter(sex__contains=sex)

        if (depart and int(depart)>-1):
            search_sql = search_sql.filter(depart=depart)

        # 序列化
        list = search_sql.filter(name__contains=name).order_by("-id")
        allList = []
        for li in list:
            allList.append({
                "id": li.id,
                "name": li.name,
                "email": li.email,
                "sex": li.sex,
                "depart": li.depart_id,
                "phone": li.phone,
                "account": li.account,
                "publish_date": json.loads(json.dumps(li.publish_date, cls=DateEncoder)),
            })
        total = len(allList)
        p = Datagrid()
        json_data_list = p.page(page, rows, total, allList)
        return HttpResponse(json.dumps(json_data_list), content_type='application/json; charset=utf-8')

# 增
def addAuthor(request):
    name = request.POST.get("name")
    email = request.POST.get("email")
    sex = request.POST.get("sex")
    depart = models.Department.objects.get(pk=request.POST.get("depart"))
    phone = request.POST.get("phone")
    account = request.POST.get("account")
    dic = {
        'name': name,
        'email': email,
        'sex': sex,
        'depart': depart,
        'phone': phone,
        'account': account
    }
    models.Author.objects.create(**dic)
    ret = {
        'success': True,
        'retCode': 0,
        'retMsg': "Author添加成功!"
    }
    return HttpResponse(json.dumps(ret), content_type='application/json')

# 删
def delAuthor(request):
    id = request.POST.get("id")
    models.Author.objects.filter(id=id).delete()
    ret = {
        'success': True,
        'retCode': 0,
        'retMsg': "Author删除成功!"
    }
    return HttpResponse(json.dumps(ret), content_type='application/json')

# 改
def modifyAuthor(request):
    id = request.POST.get("modifyId")
    name = request.POST.get("name")
    email = request.POST.get("email")
    sex = request.POST.get("sex")
    depart = models.Department.objects.get(pk=request.POST.get("depart"))
    phone = request.POST.get("phone")
    account = request.POST.get("account")
    # publish_date = models.DateTimeField(u'发布时间', auto_now_add=True, editable=True, null=True, blank=True)
    models.Author.objects.filter(id=id).update(name=name, email=email, sex=sex, depart=depart, phone=phone, account=account )
    ret = {
        'success': True,
        'retCode': 0,
        'retMsg': "Author修改成功!"
    }
    return HttpResponse(json.dumps(ret), content_type='application/json')
分页功能:common.py

#  表格
class Datagrid():
    def __init__(self):
        self.rowPageList = []
        self.json_data_list = {}

    #  分页处理
    def page(self, page, rows, total, allList):  # page: 当前页码   rows:表格1页面表格行数  total:所有数据len,  allList:所有数据
        rowPageList = []
        json_data_list = {}
        try:
            if (page == 0):                     # 第一页
                page = 1
                if (rows > len(allList)):       # 所有数据未达到一页行数时
                    json_data_list = {
                        'ret': {
                            'success': True,
                            'retCode': 200,
                            'retMsg': "查询成功!"
                        },
                        'rows': allList,
                        'total': total
                    }
                else:                               # 所有数据超过一页行数时
                    for s in range(page * rows):
                        rowPageList.append(allList[s])
                        json_data_list = {
                            'ret': {
                                'success': True,
                                'retCode': 200,
                                'retMsg': "查询成功!"
                            },
                            'rows': rowPageList,
                            'total': total
                        }
            else:                               # 非第一页
                ss = allList[page * rows:]
                if (len(ss) < rows):           # 当前页截取数据 低于 一页行数
                    json_data_list = {
                        'ret': {
                            'success': True,
                            'retCode': 200,
                            'retMsg': "查询成功!"
                        },
                        'rows': ss,
                        'total': total
                    }
                else:                         # 当前页截取数据超过 一页行数
                    for i in range(page * rows):
                        rowPageList.append(ss[i])
                        json_data_list = {
                            'ret': {
                                'success': True,
                                'retCode': 200,
                                'retMsg': "查询成功!"
                            },
                            'rows': rowPageList,
                            'total': total
                        }
            return json_data_list
        except Exception as e:
            print(e)

 

 

三、多对多

# -*-  coding:utf-8 -*-
from django.shortcuts import render
from django.http import HttpResponse
from django.core import serializers
import json
from proApp import models, base, common
import logging

# from proApp import models          # 导出Excel import
from django.http import HttpResponse
import xlwt
from io import BytesIO
import os                         # 导出Excel import

from openpyxl import Workbook,load_workbook  # 导入 excel
from openpyxl.utils import get_column_letter
from openpyxl.compatimport range    # 导入 excel
import xlrd     #excel读工具

@base.checkLogin
def index(request):
    return render(request,"book.html")

# 查
def getBook(request):
    if request.method == "GET":
        page = int(request.GET.get('page',0))-1
        rows = int(request.GET.get('rows',-1))
        list = models.Book.objects.all().order_by("-publish_date")
        allList = bookInfo(list)
        total = len(allList)
        if page < 0 or rows == 0:
            json_data_list = allList
        else:
            p = common.Datagrid()
            json_data_list = p.page(page, rows, total, allList)
        return HttpResponse(json.dumps(json_data_list), content_type='application/json; charset=utf-8')

    if request.method == "POST":
        page = int(request.POST.get('page', '')) - 1
        rows = int(request.POST.get('rows', ''))
        name = request.POST.get("name", '')
        price = request.POST.get("price")
        publisher = request.POST.get("publisher")
        author = request.POST.get("author")
        dateFrom = request.POST.get("dateFrom")
        dateTo = request.POST.get("dateTo")

        # 定一个字典用于保存前端发送过来的查询条件
        search_dict = dict()

        if dateFrom:
            search_sql = models.Book.objects.filter(publish_date__gte=dateFrom)
        else:
            search_sql = models.Book.objects

        if dateTo:
            search_sql = search_sql.filter(publish_date__lte=dateTo)

        if publisher and int(publisher)>-1:
            search_dict['publisher_id'] = publisher

        if author and int(author)>-1:
            search_dict['author'] = author

        # 序列化
        if name!="全部":
            list = search_sql.filter(name__contains=name).filter(**search_dict).order_by("-publish_date")
        else:
            list = search_sql.filter(**search_dict).order_by("-publish_date")

        allList = bookInfo(list)
        total = len(allList)
        p = common.Datagrid()
        json_data_list = p.page(page, rows, total, allList)
        return HttpResponse(json.dumps(json_data_list), content_type='application/json; charset=utf-8')

#  因获取后台数据前端不能直接使用,进行重组, 接收参数list: 数据库所有符合条件的数据
def bookInfo(list):
    allList = []
    for li in list:
        book_list = json.loads(serializers.serialize("json", li.author.all(), ensure_ascii=False))
        author_name = ''
        author_id = []
        author = []
        for i,a in enumerate(book_list):
            author_id.append(a['pk'])
            author_name += a['fields']['name'] + '、'
            author.append({"id":a['pk'],"name":a['fields']['name']})

        publisher = json.loads(serializers.serialize("json", models.Publisher.objects.filter(id=li.publisher_id), ensure_ascii=False))
        allList.append({
            "id": li.id,
            "name": li.name,
            "price": li.price,
            "saleNum": li.saleNum,
            "publisher": li.publisher_id,
            "publisher_str": publisher[0]['fields']['name'],
            "author_id": author_id,
            "author_name": author_name,
            "author": author_name,
            "publish_date": json.loads(json.dumps(li.publish_date, cls=common.DateEncoder)),
        })
    return allList

# 增
def addBook(request):
    name = request.POST.get("name")
    price = request.POST.get("price")
    saleNum = request.POST.get("saleNum")
    publisher = models.Publisher.objects.get(pk=request.POST.get("publisher"))
    authors_list = request.POST.getlist("author[]")
    dic = {
        'name': name,
        'price': price,
        'saleNum': saleNum,
        "publisher": publisher,
        # "publish_date": json.loads(json.dumps(time.time(), cls=DateEncoder)),
    }
    b1 = models.Book(**dic)
    b1.save()                                     # 普通插入的数据和外键插入的数据需要先save()
    b1 = models.Book.objects.get(name=name)       # 查出书名对象,也就是获取要插入的多对多数据项
    if len(authors_list) == 1:
        b1.author.add(authors_list[0])  # 多对多使用add方法进行插入
        b1.save()
    else:
        b1.author.add(*[authors_list])                # 循环插入用户选中的多个作者
        # for person in authors_list:
        #     b1.author.add(person)        # 多对多使用add方法进行插入
        b1.save()
    ret = {
        'success': True,
        'retCode': 200,
        'retMsg': "修改成功!"
    }
    return HttpResponse(json.dumps(ret), content_type='application/json')

# 删
def delBook(request):
    id = request.POST.get("id")
    models.Book.objects.filter(id=id).delete()
    ret = {
        'success': True,
        'retCode': 0,
        'retMsg': "删除成功!"
    }
    return HttpResponse(json.dumps(ret), content_type='application/json')

# 改
def modifyBook(request):
    try:
        id = request.POST.get("modifyId")
        name = request.POST.get("name")
        price = request.POST.get("price")
        saleNum = request.POST.get("saleNum")
        publisher = request.POST.get("publisher")
        author_list = request.POST.getlist("author[]")

        models.Book.objects.filter(id=id).update(name=name, price=price, saleNum=saleNum, publisher=publisher)
        book_obj = models.Book.objects.get(id=id)
        author_obj = models.Author.objects.filter(id__in=author_list)
        book_obj.author.set(author_obj)
        book_obj.save()
        ret = {
            'success': True,
            'retCode': 200,
            'retMsg': "修改成功!"
        }
    except Exception as e:
        logger = logging.getLogger('django')
        logger.info('-------------------------')
        logger.error(str(e))
        logger.warn('warn')
        logger.debug('debug')
        ret = {
            'success': False,
            'retCode': 200,
            'retMsg': str(e)
        }

    return HttpResponse(json.dumps(ret), content_type='application/json')

多对多:新增数据逻辑优化  获取数据必须是通过主键获取,这样才能确保唯一性

class Book(models.Model):
    id = models.FloatField(primary_key=True)   # 手动设置主键
def addBook(request):
    name = request.POST.get("name")
    price = request.POST.get("price")
    saleNum = request.POST.get("saleNum")
    publisher = models.Publisher.objects.get(pk=request.POST.get("publisher"))
    authors_list = request.POST.getlist("author[]")

    book = models.Book.objects.all()
    if len(book) > 0:
        maxId = models.Book.objects.latest('id').id
    else:
        maxId = 0
    maxId += 1

    dic = {
        'id': maxId,
        'name': name,
        'price': price,
        'saleNum': saleNum,
        "publisher": publisher,
        # "publish_date": json.loads(json.dumps(time.time(), cls=DateEncoder)),
    }
    b1 = models.Book(**dic)
    b1.save()                                     # 普通插入的数据和外键插入的数据需要先save()
    b1 = models.Book.objects.get(id=maxId)       # 查出书名对象,也就是获取要插入的多对多数据项
    if len(authors_list) == 1:
        b1.author.add(authors_list[0])  # 多对多使用add方法进行插入
        b1.save()
    else:
        for person in authors_list:     # 循环插入用户选中的多个作者
            b1.author.add(person)        # 多对多使用add方法进行插入
        b1.save()

    ret = {
        'success': True,
        'retCode': 200,
        'retMsg': "添加成功!"
    }
    return HttpResponse(json.dumps(ret), content_type='application/json')

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值