Object attribute validation in manager in Django

I have a manager in which I have

class MyManager(models.Manager):
    TYPE_PENDING = 1

    def pending():
        return self.filter(type=self.TYPE_PENDING)

      

Now I can always get a set of pending objects.

But can I also do something to check if the object is expecting?

I can of course use if object.type == MyManager.TYPE_PENDING:

, but can I do something in the manager, so I don't need to call MyManager.TYPE_PENDING

outside of the manager, but instead create a function like

def is_pending():
    return self.type == self.TYPE_PENDING

      

or something like that.

I could also do something like if object in Model.objects.pending():

, but doesn't it have bad performance since it loads the whole request?

Edit

If I have two managers PackageManager

and StateManager

associated with models Package

and State

, respectively.

class PackageManager(models.Manager):
    def delivered(self):
        return self.filter(current_state__type=1)

class StateManager(models.Manager):
    def delivered(self):
        return self.filter(type=self.model.TYPE_DELIVERED)

      

I have my choice ( TYPE_DELIVERED

etc.) defined in State

. Can I PackageManager

replace 1

it with what it should be TYPE_DELIVERED

?

I know I can write current_state__type=State.TYPE_DELIVERED

, but it calls a circular import if I have to import managers in models and models in managers.

Can I use that I can get filtering state requests for all delivered?

I mean if I can do something like

class PackageManager(models.Manager):
    def delivered(self):
        return self.filter(current_state__type=StateManager.model.TYPE_DELIVERED)

      

+3


source to share


1 answer


I think it would be more appropriate to define TYPE_PENDING

in the model itself:



class MyModel(models.Model):
    TYPE_PENDING = 1
    ...

    @property
    def is_pending(self):
        return self.type == self.TYPE_PENDING

    objects = MyManager()

...

class MyManager(models.Manager):
    def pending():
        return self.filter(type=self.model.TYPE_PENDING)

      

+5


source







All Articles