Movatterモバイル変換


[0]ホーム

URL:


Login

djangosnippets

EnhancedQuerySet

Author:
LLyaudet
Posted:
April 5, 2022
Language:
Python
Version:
3.2
Score:
0 (after 0 ratings)

A proxy for Django queryset attempting to avoid boilerplate code with ifs and avoid bugs when affectation of result is not done.

 1 2 3 4 5 6 7 8 9101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
classEnhancedQuerySet:"""    Extends the functionalities of Django QuerySet    Example:    - before:    def some_function(        fk1_ids: Optional[List[int]] = None,        fk2_ids: Optional[List[int]] = None,        fk3_ids: Optional[List[int]] = None,        fk4_ids: Optional[List[int]] = None,        pk_ids: Optional[List[int]] = None,        ...    ):        some_instances_queryset = SomeModelClass.objects.all()        if fk1_ids is not None:            some_instances_queryset = some_instances_queryset.filter(fk1_id__in=fk1_ids)        if fk2_ids is not None:            some_instances_queryset = some_instances_queryset.filter(fk2_id__in=fk2_ids)        if fk3_ids is not None:            some_instances_queryset = some_instances_queryset.filter(fk3_id__in=fk3_ids)        if fk4_ids is not None:            some_instances_queryset = some_instances_queryset.filter(fk4_id__in=fk4_ids)        if pk_ids is not None:            some_instances_queryset = some_instances_queryset.filter(id__in=pk_ids)        for some_instance in some_instances_queryset:            ...    - after:    def some_function(        fk1_ids: Optional[List[int]] = EnhancedQuerySet.IGNORE_FILTER,        fk2_ids: Optional[List[int]] = EnhancedQuerySet.IGNORE_FILTER,        fk3_ids: Optional[List[int]] = EnhancedQuerySet.IGNORE_FILTER,        fk4_ids: Optional[List[int]] = EnhancedQuerySet.IGNORE_FILTER,        pk_ids: Optional[List[int]] = EnhancedQuerySet.IGNORE_FILTER,        ...    ):        some_instances_queryset = EnhancedQuerySet(SomeModelClass.objects.all())        some_instances_queryset.filter(            fk1_id__in=fk1_ids,            fk2_id__in=fk2_ids,            fk3_id__in=fk3_ids,            fk4_id__in=fk4_ids,            id__in=pk_ids,        )        for some_instance in some_instances_queryset.queryset:            ...    You may alias EnhancedQuerySet for shorter code :    from ... import EnhancedQuerySet as EQS    def some_function(        fk1_ids: Optional[List[int]] = EQS.IGNORE_FILTER,        fk2_ids: Optional[List[int]] = EQS.IGNORE_FILTER,        fk3_ids: Optional[List[int]] = EQS.IGNORE_FILTER,        fk4_ids: Optional[List[int]] = EQS.IGNORE_FILTER,        pk_ids: Optional[List[int]] = EQS.IGNORE_FILTER,        ...    ):        some_instances_queryset = EQS(SomeModelClass.objects.all())        some_instances_queryset.filter(            fk1_id__in=fk1_ids,            fk2_id__in=fk2_ids,            fk3_id__in=fk3_ids,            fk4_id__in=fk4_ids,            id__in=pk_ids,        )        for some_instance in some_instances_queryset.queryset:            ...    """IGNORE_FILTER=object()# a sentinel for ignoring some filter to distinguish from Nonedef__init__(self,queryset):self.queryset=querysetdef_get_true_kwargs(self,kwargs:dict):true_kw_args={}forkey,valueinkwargs.items():ifvalueisEnhancedQuerySet.IGNORE_FILTER:continuetrue_kw_args[key]=valuereturntrue_kw_argsdeffilter(self,*args,**kwargs):"""        Enhanced filter function with 2 features :        - ignore some filters given with some default value        - never forget the affectation after filtering, i.e. avoid this mistake:        queryset.filter()        instead of queryset = queryset.filter()        """true_kw_args=self._get_true_kwargs(kwargs)self.queryset=self.queryset.filter(*args,**true_kw_args)defexclude(self,*args,**kwargs):"""        Similar to filter method but with exclude        """true_kw_args=self._get_true_kwargs(kwargs)self.queryset=self.queryset.exclude(*args,**true_kw_args)

More like this

  1. Mask sensitive data from logger byagusmakmun 1 week, 4 days ago
  2. Template tag - list punctuation for a list of items byshapiromatron 1 year, 2 months ago
  3. JSONRequestMiddleware adds a .json() method to your HttpRequests bycdcarter 1 year, 2 months ago
  4. Serializer factory with Django Rest Framework byjulio 1 year, 9 months ago
  5. Image compression before saving the new model / work with JPG, PNG bySchleidens 1 year, 10 months ago

Comments

Pleaselogin first before commenting.


[8]ページ先頭

©2009-2025 Movatter.jp