@@ -2754,68 +2754,73 @@ def update_empties(obj):
2754
2754
2755
2755
def test_subquery (self ):
2756
2756
2757
- EnumClass = self .MODEL_CLASS ._meta .get_field ('pos' ).enum
2758
- self .MODEL_CLASS .objects .all ().delete ()
2757
+ for field in [
2758
+ field for field in self .MODEL_CLASS ._meta .fields
2759
+ if isinstance (field , FlagField )
2760
+ and not isinstance (field , ExtraBigIntegerFlagField )
2761
+ ]:
2762
+ EnumClass = field .enum
2763
+ self .MODEL_CLASS .objects .all ().delete ()
2759
2764
2760
- objects = [
2761
- self .MODEL_CLASS .objects .create (
2762
- pos = EnumClass .TWO | EnumClass .FOUR | EnumClass .FIVE
2763
- ),
2764
- self .MODEL_CLASS .objects .create (
2765
- pos = EnumClass .ONE | EnumClass .THREE
2766
- ),
2767
- self .MODEL_CLASS .objects .create (
2768
- pos = EnumClass .TWO | EnumClass .FOUR
2769
- ),
2770
- self .MODEL_CLASS .objects .create (
2771
- pos = EnumClass .FIVE
2772
- ),
2773
- self .MODEL_CLASS .objects .create (
2774
- pos = (
2775
- EnumClass .ONE | EnumClass .TWO | EnumClass .THREE |
2776
- EnumClass .FOUR | EnumClass .FIVE
2765
+ objects = [
2766
+ self .MODEL_CLASS .objects .create (
2767
+ ** {field .name : EnumClass .TWO | EnumClass .FOUR | EnumClass .FIVE }
2768
+ ),
2769
+ self .MODEL_CLASS .objects .create (
2770
+ ** {field .name : EnumClass .ONE | EnumClass .THREE }
2771
+ ),
2772
+ self .MODEL_CLASS .objects .create (
2773
+ ** {field .name : EnumClass .TWO | EnumClass .FOUR }
2774
+ ),
2775
+ self .MODEL_CLASS .objects .create (** {field .name : EnumClass .FIVE }),
2776
+ self .MODEL_CLASS .objects .create (
2777
+ ** {
2778
+ field .name : (
2779
+ EnumClass .ONE | EnumClass .TWO | EnumClass .THREE |
2780
+ EnumClass .FOUR | EnumClass .FIVE
2781
+ )
2782
+ }
2777
2783
)
2778
- )
2779
- ]
2780
-
2781
- exact_matches = self .MODEL_CLASS .objects .filter (
2782
- pos__exact = OuterRef ("pos" )
2783
- ).order_by ().annotate (
2784
- count = Func (F ('id' ), function = 'Count' )
2785
- ).values ('count' )
2786
-
2787
- any_matches = self .MODEL_CLASS .objects .filter (
2788
- pos__has_any = OuterRef ("pos" )
2789
- ).order_by ().annotate (
2790
- count = Func (F ('id' ), function = 'Count' )
2791
- ).values ('count' )
2792
-
2793
- all_matches = self .MODEL_CLASS .objects .filter (
2794
- pos__has_all = OuterRef ("pos" )
2795
- ).order_by ().annotate (
2796
- count = Func (F ('id' ), function = 'Count' )
2797
- ).values ('count' )
2798
-
2799
- for obj in self .MODEL_CLASS .objects .annotate (
2800
- exact_matches = Subquery (exact_matches )
2801
- ):
2802
- self .assertEqual (obj .exact_matches , 1 )
2784
+ ]
2785
+
2786
+ exact_matches = self .MODEL_CLASS .objects .filter (
2787
+ ** {f'{ field .name } __exact' : OuterRef (field .name )}
2788
+ ).order_by ().annotate (
2789
+ count = Func (F ('id' ), function = 'Count' )
2790
+ ).values ('count' )
2791
+
2792
+ any_matches = self .MODEL_CLASS .objects .filter (
2793
+ ** {f'{ field .name } __has_any' : OuterRef (field .name )}
2794
+ ).order_by ().annotate (
2795
+ count = Func (F ('id' ), function = 'Count' )
2796
+ ).values ('count' )
2797
+
2798
+ all_matches = self .MODEL_CLASS .objects .filter (
2799
+ ** {f'{ field .name } __has_all' : OuterRef (field .name )}
2800
+ ).order_by ().annotate (
2801
+ count = Func (F ('id' ), function = 'Count' )
2802
+ ).values ('count' )
2803
+
2804
+ for obj in self .MODEL_CLASS .objects .annotate (
2805
+ exact_matches = Subquery (exact_matches )
2806
+ ):
2807
+ self .assertEqual (obj .exact_matches , 1 )
2803
2808
2804
- for expected , obj in zip (
2805
- [2 , 2 , 3 , 3 , 1 ],
2806
- self .MODEL_CLASS .objects .annotate (
2807
- all_matches = Subquery (all_matches )
2808
- ).order_by ('id' )
2809
- ):
2810
- self .assertEqual (obj .all_matches , expected )
2809
+ for expected , obj in zip (
2810
+ [2 , 2 , 3 , 3 , 1 ],
2811
+ self .MODEL_CLASS .objects .annotate (
2812
+ all_matches = Subquery (all_matches )
2813
+ ).order_by ('id' )
2814
+ ):
2815
+ self .assertEqual (obj .all_matches , expected )
2811
2816
2812
- for expected , obj in zip (
2813
- [4 , 2 , 3 , 3 , 5 ],
2814
- self .MODEL_CLASS .objects .annotate (
2815
- any_matches = Subquery (any_matches )
2816
- ).order_by ('id' )
2817
- ):
2818
- self .assertEqual (obj .any_matches , expected )
2817
+ for expected , obj in zip (
2818
+ [4 , 2 , 3 , 3 , 5 ],
2819
+ self .MODEL_CLASS .objects .annotate (
2820
+ any_matches = Subquery (any_matches )
2821
+ ).order_by ('id' )
2822
+ ):
2823
+ self .assertEqual (obj .any_matches , expected )
2819
2824
2820
2825
def test_unsupported_flags (self ):
2821
2826
obj = self .MODEL_CLASS .objects .create ()
0 commit comments