[Django]-Django: Casting Abstract Models

3👍

def some_func(name, Instance):
    i = Instance.objects.get(id=1)
    i.name = "some name"
    i.save()

The good idea is using strategy pattern, article for example: https://medium.com/@sheikhsajid/design-patterns-in-python-part-1-the-strategy-pattern-54b24897233e

3👍

You can add this as a @classmethod on the Cereal model:

class Cereal(models.Model):
    name = models.CharField()

    @classmethod
    def some_func_cereal(cls, name):
        bowled = cls.objects.get(id=1)
        bowled.name = name
        bowled.save()

    class Meta:
        abstract = True

You can then call this method with:

Boxed.some_func_cereal('Captain Crunch')
Bowled.some_func_cereal('Lucky Charms')

The class with which you call the class method, is passed as the cls parameter in the some_func_cereal function.

3👍

You could add an update method to your Cereal absract class such as:

    class Cereal:

        def update(self, **kwargs):
            for key, val in kwargs.items():
                setattr(self, key, val)
            self.save(update_fields=kwargs.keys())
            return self

and use it as follows to update any column you like

    BoxedInstance.update(name="new name")

    or 

    BoxedInstance.update(name="new name", taste="cardboardy")

Leave a comment