@@ -642,6 +642,74 @@ def test_date_filters(self):
642642 "one person died"
643643 )
644644
645+ def test_datetime_derivatives_with_values (self ):
646+ logs = FakeQuerySet (Log , [
647+ Log (time = datetime .datetime (1979 , 7 , 1 , 1 , 1 , 1 ), data = "nobody died" ),
648+ Log (time = datetime .datetime (1980 , 2 , 2 , 2 , 2 , 2 ), data = "one person died" ),
649+ Log (time = None , data = "nothing happened" )
650+ ])
651+
652+ self .assertEqual (
653+ list (logs .all ().values ("time__date" , "time__time" )),
654+ [
655+ {"time__date" : datetime .date (1979 , 7 , 1 ), "time__time" : datetime .time (1 , 1 , 1 )},
656+ {"time__date" : datetime .date (1980 , 2 , 2 ), "time__time" : datetime .time (2 , 2 , 2 )},
657+ {"time__date" : None , "time__time" : None },
658+ ]
659+ )
660+
661+ self .assertEqual (
662+ list (logs .all ().values ("time__year" , "time__iso_year" , "time__month" , "time__day" , "time__hour" , "time__minute" , "time__second" )),
663+ [
664+ {"time__year" : 1979 , "time__iso_year" : 1979 , "time__month" : 7 , "time__day" : 1 , "time__hour" : 1 , "time__minute" : 1 , "time__second" : 1 },
665+ {"time__year" : 1980 , "time__iso_year" : 1980 , "time__month" : 2 , "time__day" : 2 , "time__hour" : 2 , "time__minute" : 2 , "time__second" : 2 },
666+ {"time__year" : None , "time__iso_year" : None , "time__month" : None , "time__day" : None , "time__hour" : None , "time__minute" : None , "time__second" : None }
667+ ]
668+ )
669+
670+ self .assertEqual (
671+ list (logs .all ().values ("time__week" , "time__week_day" , "time__iso_week_day" , "time__quarter" )),
672+ [
673+ {"time__week" : 26 , "time__week_day" : 1 , "time__iso_week_day" : 7 , "time__quarter" : 3 },
674+ {"time__week" : 5 , "time__week_day" : 7 , "time__iso_week_day" : 6 , "time__quarter" : 1 },
675+ {"time__week" : None , "time__week_day" : None , "time__iso_week_day" : None , "time__quarter" : None },
676+ ]
677+ )
678+
679+ def test_datetime_derivatives_with_values_list (self ):
680+ logs = FakeQuerySet (Log , [
681+ Log (time = datetime .datetime (1979 , 7 , 1 , 1 , 1 , 1 ), data = "nobody died" ),
682+ Log (time = datetime .datetime (1980 , 2 , 2 , 2 , 2 , 2 ), data = "one person died" ),
683+ Log (time = None , data = "nothing happened" )
684+ ])
685+
686+ self .assertEqual (
687+ list (logs .all ().values_list ("time__date" , "time__time" )),
688+ [
689+ (datetime .date (1979 , 7 , 1 ), datetime .time (1 , 1 , 1 )),
690+ (datetime .date (1980 , 2 , 2 ), datetime .time (2 , 2 , 2 )),
691+ (None , None ),
692+ ]
693+ )
694+
695+ self .assertEqual (
696+ list (logs .all ().values_list ("time__year" , "time__iso_year" , "time__month" , "time__day" , "time__hour" , "time__minute" , "time__second" )),
697+ [
698+ (1979 , 1979 , 7 , 1 , 1 , 1 , 1 ),
699+ (1980 , 1980 , 2 , 2 , 2 , 2 , 2 ),
700+ (None , None , None , None , None , None , None ),
701+ ]
702+ )
703+
704+ self .assertEqual (
705+ list (logs .all ().values_list ("time__week" , "time__week_day" , "time__iso_week_day" , "time__quarter" )),
706+ [
707+ (26 , 1 , 7 , 3 ),
708+ (5 , 7 , 6 , 1 ),
709+ (None , None , None , None ),
710+ ]
711+ )
712+
645713 def test_queryset_filtering_accross_foreignkeys (self ):
646714 band = Band (
647715 name = "The Beatles" ,
0 commit comments