xml地图|网站地图|网站标签 [设为首页] [加入收藏]
django查询数据库无法过滤月份的解决,python实现
分类:编程

我试过,当settings里的:USE_TZ = False时也可以查询,但是数据库里的时间就会显示错的

《asp.net-mvc框架揭秘》一书中,有个示例,是使用unity容器来注入自定义的控制器工厂。代码示例可以自己去下载源码,在这里我就不说了。IOC容器的本质是解耦的实例化接口类,而如何做到解耦就是通过第三方容器来实例化,在这里是unity容器,而不是在项目中实例化接口类。实例化的方法无非就是反射,Emit,表达式树,委托等四个方法。Unity容器的IOC使用主要是三个个方法:Register,Resolver,Dispose。前者注册接口和接口类,后者将接口类的实例化转移到第三方容器中实现。而这里的Dispose却是有点文章了。如果单单是控制台的应用项目,就不必多说,如果是在mvc框架中的话,我们的接口类的资源释放应该放在什么地方合适呢?微软unity开发小组给我们做了很好的解释,原文:
我们将Unity容器里面资源的释放与控制器的资源释放绑定在一起。如何用代码来表示?我们在基于Unity的控制器工厂中的GetControllerInstance中解析controllerType对象,而不是解析某个接口:
(IController)this.UnityContainer.Resolve(controllerType);
尽管Unity容器是IOC框架,我们还是可以使用unity来做AOP,可以参考的官方资料:(5 - Interception using Unity).aspx)
我们主要是通过集成ICallHandler接口来实现AOP,这个接口是unity给我们提供的,这个接口主要就是一个Invoke方法。继承自ICallHandler接口的类(TCalHandler),当通过接口(TIOCInterface)开始调用类(TIOCImple)中的方法时,就会开始调用类(TCalHandler)的Invoke方法。
在Invoke中,如果调用getNext()方法就会调用IOCImple标注了属性的方法。如果你的C#基础比较扎实,你对C#中的一个重要知识点-特性(attribute)应该就会有印象以及一定的了解。asp.net-mvc框架中的过滤器就是基于attribute实现的。那么在这里也是,我们需要调用unity给我们提供的一个特性attribute-HandlerAttribute,在这里我们调用我们基于ICallHandler的类。
DI是为了解耦的实例化接口,而AOP是横向的注入一些逻辑,我们可以在AOP里面实现DI,unity中的AOP模块默认会给我们实现DI,一旦我们实现了AOP,就相当于实现了DI。我会挑一些代码片段来解释。代码来自<<asp.net-mvc框架揭秘>>的第14章S1401源码。首先我们实现自己自定义的控制器工厂:

实现思路

  将所需要的数字存入一个列表中

  1. 首先,设置将最左侧的那个数设置为基准数,在列表中索引为0
  2. 然后设置两个移动位(用于比较),分别为最左边和最右边
  3. 然后最右边那位向左移寻找比基准数小的那一位,最右边那位则从左向右寻找比基准数大的那一位
  4. 再后,将找到的两位对应的数字替换,继续执行3,直到两个移动位相遇,把基准为替换到相遇的那一位
  5. 最后,将列表以基准数那一位一分为二切开,左边和右边部分继续执行上述1-4步,直到没有比较数为止(也就是一个数),排序完成。

看下图你就明白了:

图片 1

解决方法是可以再终端输入 mysql_tzinfo_to_sql /usr/share/zoneinfo
然后重启数据库

图片 2图片 3

实现代码

 1 # coding: utf-8
 2 # 快速排序,利用二分思想实现
 3 
 4 
 5 def quick_sort(list, left, right):
 6     if left > right:
 7         return
 8     temp = list[left]
 9     i = left
10     j = right
11     while i != j:
12         # 先从右向左寻找
13         while list[j] >= temp and i < j:
14             j -= 1
15         # 再从左向右寻找
16         while list[i] <= temp and i < j:
17             i += 1
18         if i < j:
19             t = list[i]
20             list[i] = list[j]
21             list[j] = t
22     # 基准数替换
23     list[left] = list[i]
24     list[i] = temp
25     # 递归调用
26     quick_sort(list, left, i - 1)
27     quick_sort(list, i + 1, right)
28 
29 
30 while True:
31     list = []
32     try:
33         num = int(input('你想比较几个数?n'))
34     except ValueError:
35         continue
36     for k in range(num):
37         a = int(input('请输入第' + str(k+1) + '个数:n'))
38         list.append(a)
39     quick_sort(list, 0, num-1)
40     print('排序结果为:')
41     for l in range(len(list)):
42         print(list[l], end=' ')
43     print()

快速排序的时间复杂度为:O(NlogN),所以快速排序比较冒泡排序效率要高得多~

原因是django查询数据库时sql语句会用转换时区函数,而mysql无法获取Asia/Shanghai的正确时间,所以会返回空

public class UnityControllerFactory : DefaultControllerFactory
{
    public IUnityContainer UnityContainer { get; private set; }

    public UnityControllerFactory(IUnityContainer unityContainer)
    {
        this.UnityContainer = unityContainer;
    }

    protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType)
    {
        if (null == controllerType)
        {
            return null;
        }
        return (IController)this.UnityContainer.Resolve(controllerType);
    }
}

有问题的可以留言

View Code

 

之前说过的unity的DI对象 Resolve是在这里完成的。

我们定义了一个接口ITimeProvider和接口实现类DefaultTimeProvider,然后我们基于ICallHandler接口实现一个类:

图片 4图片 5

public class CachingCallHandler : ICallHandler
{
    public int Order { get ; set ; }

    public TimeSpan ExpirationTime { get; private set; }

    public static TimeSpan DefaultExpirationTime { get; private set; }

    public static Func<MethodBase, object[], string> CacheKeyGenerator { get; private set; }

    // 静态构造函数,只调用一次,并且是最先调用的
    static CachingCallHandler()
    {
        DefaultExpirationTime = new TimeSpan(0, 5, 0);
        Guid prefix = Guid.NewGuid();

        CacheKeyGenerator = (method, inputs) =>
        {
            StringBuilder sb = new StringBuilder();

            sb.AppendFormat("{0}: ", prefix);
            sb.AppendFormat("{0}: ", method.DeclaringType);
            sb.AppendFormat("{0}: ", method.Name);

            if (inputs != null)
            {
                foreach (var input in inputs)
                {
                    string hashCode = (input == null) ? "" : input.GetHashCode().ToString();
                    sb.AppendFormat("{0}: ", hashCode);
                }
            }
            return sb.ToString().TrimEnd(':');
        };

    }

    public CachingCallHandler(TimeSpan? expirationTime=null)
    {
        this.ExpirationTime = expirationTime.HasValue ? expirationTime.Value : DefaultExpirationTime;
    }

    public IMethodReturn Invoke(IMethodInvocation input, GetNextHandlerDelegate getNext)
    {
        MethodInfo targetMethod = (MethodInfo)input.MethodBase;

        if(targetMethod.ReturnType == typeof(void))
        {
            return getNext()(input, getNext);
        }

        object[] inputs = new object[input.Inputs.Count];
        input.Inputs.CopyTo(inputs, 0);
        string cacheKey = CacheKeyGenerator(targetMethod, inputs);

        object[] cachedResult = HttpRuntime.Cache.Get(cacheKey) as object[];

        if (null == cachedResult)
        {
            IMethodReturn realReturn = getNext()(input, getNext);
            if(null == realReturn.Exception)
            {
                HttpRuntime.Cache.Insert(cacheKey, new object[] { realReturn.ReturnValue }, null, DateTime.Now.Add(this.ExpirationTime), Cache.NoSlidingExpiration);
            }
            return realReturn;
        }
        return input.CreateMethodReturn(cachedResult[0], new object[] { input.Arguments });

    }
}

View Code

本文由澳门新葡亰手机版发布于编程,转载请注明出处:django查询数据库无法过滤月份的解决,python实现

上一篇:没有了 下一篇:自学成才之路,使用else代替状态变量
猜你喜欢
热门排行
精彩图文