为Django的manage.py添加自定义命令

有时候会有这样的需求,为django执行一些定时任务,比如通知搜索引擎,例如百度,提交网站的一些地址给他们,通过为django的manage.py添加自定义命令可以很容易的解决这个问题。下面介绍下如何添加。

首先需要在创建好的app应用的根目录创建文件夹名为management的目录,然后继续在该目录创建commands的目录,并在两个目录中都要创建__init__.py的python文件。 目录创建好之后继续在commands的目录中添加notify_baidu.py文件,文件名将会是manage.py的命令名。目录结构如下:

示例图片

代码内容大概如下:

# -*- coding: …

Django中使用Q构建复杂查询

一般我们在Django程序中查询数据库操作都是在QuerySet里进行进行,随着我们的程序越来越复杂,查询的条件也跟着复杂起来,这样简单的通过一个filter()来进行查询的条件将导致我们的查询越来越长。当我们在查询的条件中需要组合条件时(例如两个条件“且”或者“或”)时。我们可以使用Q()查询对象。

比如有以下表:

from django.db import models

class Blog(models.Model):
    text = models.CharField(max_length=200)
    pub_date = models.DateTimeField('published_date')

    def …

Django QuerySet查询优化

常有人拿SQL和Django的ORM查询对比(即QuerySet),总说QuerySet执行效率慢。呵呵,QuerySet只不过是多了一个解析步骤而已。实际执行效率快慢和你写的QuerySet查询有关系。正如不同的SQL语句也有执行效率快慢问题。

1、简单的QuerySet查询

一般简单的QuerySet查询没什么需要优化的。有关QuerySet基础可参考:QuerySet查询基础。简单的QuerySet通常是在一个表上的查询,尽量避免使用__in条件即可。该__in对应SQL语句的in条件,这种类型的条件判断执行效率较慢。若in条件的值比较少,建议使用or逻辑合并条件。例如:

qs = Blog.objects.filter(id__in=[1, 5, 20])

可修改为如下两种写法:

# 方法1:直接合并
qs …

django数据查询优化annotate和aggregate

django查询QuerySet集合的方式,常用到的有filter/Q函数/exclude等方式,数据量比较小的时候还可以,但是如果数据量很大,而且查询比较复杂,那么如果还是使用多个filter进行查询效率就会很低。

提高查询数据库效率的方案有两种:

第一种,是使用原生的SQL语句来进行查询,这样的优点在于能够完全按照开发者的意图来执行,效率会很高,但是缺点也很明显:1.开发者需要非常熟悉SQL语句,加大开发者的工作量,同时,夹杂着SQL的项目也不利于以后程序的维护,增大程序的耦合度。2.若查询条件是动态变化的,则会使开发变得更加困难。

django为了解决这一难题,提供了aggregate(聚合函数)和annotate(在aggregate的基础上进行GROUP BY操作)。

下面,就来介绍第二种方法。

理解aggregate和annotate的关键在于理解SQL中的聚合函数:以下摘自百度百科:SQL基本函数,聚合函数对一组值执行计算,并返回单个值。除了 COUNT 以外,聚合函数都会忽略空值。 常见的聚合函数有AVG / COUNT / MAX / …

Python + Django项目常用装饰器及自定义函数

1. 自定义返回请求值的函数
def render_json(data, status=200):
    return HttpResponse(json.dumps(data), content_type="text/json", status=status)

def render_json_error(message, status=400):
    return render_json(message, status) …