什么是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,也许你也有想法,欢迎评论。