Получить фильтр kwargs от Django Queryset в model manager

У меня есть Companyмодель, которая скрывает некоторые из его status. Поэтому, когда пользователь запрашиваетCompany.objects.all(), я отфильтрую любой из специальныхstatus, которые я считаю неуместными.
Что-то вроде ниже

class Company(models.Model):
   name=models.TextField()
   status=models.CharField()
   ...
   objects = FilteredCompanyManager()

где

class FilteredCompanyManager(models.Manager):
    def get_queryset(self):
        return super(FilteredCompanyManager, self).get_queryset().exclude(status__in=CompanyConstants.SPECIAL_STATUS.values())

Мой вопрос в том, что я хочу что-то вроде Company.objects.filter(displayAllObjects=True)не исключать никаких статусов. Таким образом, мое измененное вымышленное FilteredCompanyManagerбудет выглядеть примерно так

class FilteredCompanyManager(models.Manager):
    def get_queryset(self):
        if 'displayAllObjects' in super(FilteredCompanyManager, self).get_queryset().get_kwargs():
            return  super(FilteredCompanyManager, self).get_queryset()
        else:
            return super(FilteredCompanyManager, self).get_queryset().exclude(status__in=CompanyConstants.SPECIAL_STATUS.values())

Я знаю, что я, вероятно, могу сделать это с objects=FilteredCompanyManagerи allObjects=models.Manager()но хочу способ, где это возможно в одной модели менеджера, а не с двумя моделями менеджеров.

1 ответ

  1. Вы должны сделать метод менеджера, в котором вы могли бы отправить displayAllObjectsв kwargs:

    class FilteredCompanyManager(models.Manager):
    
         def get_filtered_objs(self, *args, **kwargs):
            if kwargs.pop('displayAllObjects', False):
                 return self.get_queryset().all()
            else:
                 return self.get_queryset().exclude(status__in=CompanyConstants.SPECIAL_STATUS.values())
    

    Теперь вы можете использовать его следующим образом:

    Company.objects.get_filtered_objs(displayAllObjects=True)
    

    Или

    Company.objects.get_filtered_objs()