Search code examples
djangodjango-modelsdjango-managers

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()

Solution

  • 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()