django mysql 降序_Django的常用数据库技巧(新手向)

什么是Django?

Django是用python编写的大而全的web框架。他们官方的广告语是“The web framework for perfectionists with deadlines.”即“面临截止期限的完美主义者的web框架。”Python是面向新手的编程语言,易学、社区丰富是python的优势。

业余编程者使用django来写几个小web项目最合适不过。为什么这么说呢?因为本人就不是职业写代码的,也尝试过flask和web2py,最终还是选择django。初学者在flask学习时难度其实也不大,但是开发过程中难免需要一些第三方库来扩充web程序的功能,而flask的第三方配套库的选项非常多,初学者往往会浪费精力选择趁手的第三方库,而web项目迟迟不能完成。使用django完全没有这个问题,因为官方就把你能用的大多数功能全都集成好了,拿来直接用,官方文档也写的清清楚楚(django官方文档质量是真的高,看过就知道)。

数据库操作ORM简介

web开发无非就是打理好格式化的数据,而数据库是管理数据的最佳工具,业余人员想直接写sql操作数据库难度有点大,而django为此提供了orm操作的工具,使得开发者可以像操作普通的类一样操作数据库。无疑大大降低了开发者的心智负担。

需要指出的是即使写sql不熟练,适当了解一下数据库的基础知识,对于web开发非常有益。这里将一些常用的经验技巧总结梳理一下。

常用的数据库操作

计算列

这是一种常用的结构,比如某表中,已有单价和数量,可以使用计算列返回总价,示例代码如下

class Goods(models.Model):

unit_price = models.DecimalField(max_digits = 8, decimal_places=2)

quantity = models.IntergerField()

def price(self):

return self.unit_price * self.quantity

聚合

开发中经常遇到的需求是计算一个累计值或者平均值,有小伙伴上来就写了个循环来计算累计值或平均值,这有点莽。官方推荐使用 aggregate() ,来看示例代码:

使用官方给的model:

from django.db import models

class Author(models.Model):

name = models.CharField(max_length=100)

age = models.IntegerField()

class Publisher(models.Model):

name = models.CharField(max_length=300)

class Book(models.Model):

name = models.CharField(max_length=300)

pages = models.IntegerField()

price = models.DecimalField(max_digits=10, decimal_places=2)

rating = models.FloatField()

authors = models.ManyToManyField(Author)

publisher = models.ForeignKey(Publisher, on_delete=models.CASCADE)

pubdate = models.DateField()

class Store(models.Model):

name = models.CharField(max_length=300)

books = models.ManyToManyField(Book)

计算平均值:

>>> from django.db.models import Avg

>>> Book.objects.aggregate(Avg('price'))

{'price__avg': 34.35}

如果想给计算出的值一个名称,可以这么写:

>>> Book.objects.aggregate(average_price=Avg('price'))

{'average_price': 34.35}

如果计算最大值,最小值,一次计算多个聚合值,可以这么写:

>>> from django.db.models import Avg, Max, Min

>>> Book.objects.aggregate(Avg('price'), Max('price'), Min('price'))

{'price__avg': 34.35, 'price__max': Decimal('81.20'), 'price__min': Decimal('12.99')}

Meta类

有时候需要对模型做些设置,例如排序、表名、单复数写法等与数据库字段无关的表设置选项,可以使用model的Meta类

示例代码:

from django.db import models

class Ox(models.Model):

horn_length = models.IntegerField()

class Meta:

ordering = ["horn_length"] # 按照哪个字段进行排序

verbose_name_plural = "oxen" # 设置单复数名

db_table = 'music_album' # 设置数据库中的对应的表名

get_latest_by = ['-priority', 'order_date'] # 取最后一个,按照priority降序, order_date升序

permissions = [('can_deliver_pizzas', 'Can deliver pizzas')] # 设置权限

verbose_name = "pizza" # 人类可读的表名

在数据表建立索引也是用Meta:

from django.db import models

class Customer(models.Model):

first_name = models.CharField(max_length=100)

last_name = models.CharField(max_length=100)

class Meta:

indexes = [

models.Index(fields=['last_name', 'first_name']),

models.Index(fields=['first_name'], name='first_name_idx'),

]

总结

用django操作数据库真的舒服,掌握这些技巧后能大大提高效率,在高手眼里这些技巧其实都是基础,请轻喷o(* ̄︶ ̄*)o,也许你也有想法,欢迎评论。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值