Loading

Django 知识点小记

版本: Django2.x

记一下平时写项目过程中遇到的点

创建 Django 项目

先进入到你想要创建 project 目录下,执行命令

django-admin startproject projectname

不报错即可,创建的文件结构为

创建apps

在project目录中执行

django-admin startapp appname

ORM对某个字段模糊搜索

写 filter 的时候字段名后面加上 __icontains 代表模糊搜索且不区分大小写

__contains 代表区分大小写的模糊搜索

例如

# 对name字段进行不区分大小写模糊搜索
xx.filter(name__icontains=value).xx
# 对name字段进行区分大小写的模糊搜索
xx.filter(name__contains=value).xx

ORM查询中的动态字段

如有这样的需求,某个查询是有多个参数,而参数可以有多个值也可以没有值.后端该怎么解决呢?

看有人套 if else 来判断出所有不停的情况,如果一两个可变字段还好,有多个的话代码该有多少

我们可以利用 ORM 的filter参数可传 **kwargs 的特征来写出既满足需求又可维护可扩展的代码,例如:

def search(**kwargs):
    '''
    查询组件
    : param **kwargs:
    : return querysite:
    '''

    # 本次ORM查询
    filter_kwargs = dict()
    
    # 因时间区间判断ORM需要指定不同的key所以分别判断
    # 指定开始/结束时间
    if (kwargs["start_time"] and kwargs["end_time"]):
        filter_kwargs["online_time__range"] = (kwargs["start_time"], kwargs["end_time"])
    # 指定开始时间
    elif kwargs["start_time"]:
        filter_kwargs["online_time__gt"] = kwargs["start_time"]
    # 指定结束时间
    elif kwargs["end_time"]:
        filter_kwargs["online_time__lte"] = kwargs["end_time"]
    
    # 普通字段
    # 有上/下线状态
    if kwargs["status"]:
        filter_kwargs["status"] = kwargs["status"]
    
    # 有IP,模糊匹配,不区分大小写
    if kwargs["ip"]:
        filter_kwargs["ip__icontains"] = kwargs["ip"]

    # 按online_time排序
    querysite = log.objects.filter(**filter_kwargs).order_by('-online_time') 
    return querysite

利用filter的特征,我们没必要将其所有搭配情况写全,而是只对某个单一字段进行分别区分,打个比方,如果你传了ip字段,那么我就在filter中加上ip字段.

然后将这个集合了当前查询的匹配字典,传入**kwargs会将字典打成 k=v 的形式传入, 达到同样的效果.

如果字段要增加/删除/修改 则只需要修改该字段的判断即可

posted @ 2019-10-16 14:25  ChnMig  阅读(285)  评论(0编辑  收藏  举报