Get value for each model field with _meta

Viewed 161

In my model, I have a method for getting verbose_name for each field with _meta. How can I get value for each field similar way with _meta?

class Description(models.Model):
    name = models.OneToOneField(Breeds, on_delete=models.CASCADE, primary_key=True)
    description = models.TextField()
    history = models.TextField()
    nature = models.TextField()
    care = models.TextField()
    feed = models.TextField()
    health = models.TextField()
    some_facts = models.TextField()

    def __str__(self):
        return self.name.breed

    def get_verbose_name(self):
        return [field.verbose_name for field in Description._meta.fields]

I want to get values similar to the get_verbose_name method.

1 Answers

You can obtain the values by using field.get_attname() to obtain the name of the attribute, and then access getattr(self, field.get_attname()):

class BaseModel(models.Model):
        
    # …
    
    def get_values(self):
        return {
            field.name: getattr(self, field.get_attname())
            for field in cls._meta.fields
        }

This will then return a dictionary that maps the field names to the corresponding object.

or as a list of values:

class BaseModel(models.Model):
        
    # …
    
    def get_values(self):
        return [
            getattr(self, field.get_attname())
            for field in cls._meta.fields
        ]
Related