NEB
NEB

Reputation: 734

Django custom model manager

If we have model like

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

and in every query for a given value if we have to check against both the fields, is it possible to simplify the redundancy (field_1=value, field_2=value) using a custom Manager ?

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

Upvotes: 1

Views: 38

Answers (1)

willeM_ Van Onsem
willeM_ Van Onsem

Reputation: 477607

Yes, you can make a mananger, like:

class SomeModelManager(models.Manager):

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

or with an or-condition:

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)

We can then add the manager to the SomeModel model:

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

    object = SomeModelManager()

Then you can access the filtered queryset with:

SomeModel.objects.with_value(value)
SomeModel.objects.with_value(value).count()

Upvotes: 1

Related Questions