Диспетчер пользовательских моделей Django

Если у нас есть модель вроде

class SomeModel(models.Model):
    field_1 = models.IntegerField()
    field_2 = models.IntegerField()

и в каждом запросе для данного value, если нам нужно проверять оба поля, можно ли упростить избыточность (field_1=value, field_2=value) с помощью пользовательского Manager?

SomeModel.objects.filter(Q(field_1=value) | Q(field_2=value))
SomeModel.objects.filter(Q(field_1=value) | Q(field_2=value)).count()

person NEB    schedule 04.02.2020    source источник
comment
Учитывая, что вам каждый раз нужно это делать, есть ли ситуация, когда field_1 и field_2 имеют разные значения?   -  person Willem Van Onsem    schedule 05.02.2020
comment
Хороший улов. Нет, они никогда не будут прежними, и это условие or вместо and.   -  person NEB    schedule 05.02.2020


Ответы (1)


Да, вы можете создать менеджера, например:

class SomeModelManager(models.Manager):

    def with_value(self, value):
        return self.get_queryset().filter(field_1=value, field_2=value)

или с условием или:

from django.db.models import Q

class SomeModelManager(models.Manager):

    def with_value(self, value):
        return self.get_queryset().filter(Q(field_1=value) | Q(field_2=value)

Затем мы можем добавить менеджера в модель SomeModel:

class SomeModel(models.Model):
    field_1 = models.IntegerField()
    field_2 = models.IntegerField()

    object = SomeModelManager()

Затем вы можете получить доступ к отфильтрованному набору запросов с помощью:

SomeModel.objects.with_value(value)
SomeModel.objects.with_value(value).count()
person Willem Van Onsem    schedule 04.02.2020
comment
Понятно. Спасибо. - person NEB; 05.02.2020