purpose of meta class in django

from django.db import models

class Ox(models.Model):
    horn_length = models.IntegerField()

    class Meta:
        ordering = ["horn_length"]
        verbose_name_plural = "oxen"
        
        
        //Model metadata is “anything that’s not a field”, such as ordering options (ordering), database table name (db_table), or human-readable singular and plural names (verbose_name and verbose_name_plural). None are required, and adding class Meta to a model is completely optional.

Here is what the above code is Doing:
1. ordering is a list or tuple of fields used to control the order in which objects are returned in a QuerySet.
2. db_table is the name of the database table to use for the model.
3. verbose_name is a human-readable name for the object, singular.
4. verbose_name_plural is its plural name.
5. get_latest_by controls the ordering of the queryset returned by the model manager’s latest() and earliest() methods.
6. ordering, ordering_fields, and get_latest_by are all included in the Meta class for backwards compatibility with pre-1.6 versions of Django.
7. unique_together is a tuple of tuples, where each tuple is a list of field names that, taken together, must be unique.
8. index_together is similar to unique_together, but for creating database indexes.
9. permissions is a list of (name, permission) tuples where name is the name of the permission you’re creating and permission is either a permission object or a tuple of (app_label, codename).
10. default_permissions is a list of permission names that will be created for this model by Django when you run manage.py syncdb.
11. select_on_save is a boolean that controls whether Django will emit a SELECT query after an INSERT or UPDATE query that modifies the table.
12. db_tablespace is the name of the database tablespace to use for this model.
13. managed is a boolean that controls whether Django will create, modify, and delete the database tables for your models automatically; if you leave it set to True, Django will do this for you automatically when you run manage.py syncdb.
14. abstract is a boolean that controls whether to create a database table for this model. If you set this to True, no database table will be created for this model. This is useful if you want to put some extra fields on a few of your models but not all of them.
15. app_label is the name of the application the model lives in.
16. db_table is the name of the database table to use for the model.
17. managed is a boolean that controls whether Django will create, modify, and delete the database tables for your models automatically; if you leave it set to True, Django will do this for you automatically when you run manage.py syncdb.
18. proxy is a boolean that controls whether to create a proxy model. If you set this to True, no database table will be created for this model, and the model won’t appear in Django’s admin.
19. ordering is a list or tuple of fields used to control the order in which objects are returned in a QuerySet.
20. get_latest_by controls the ordering of the queryset returned by the model manager’s latest() and earliest() methods.
21. ordering, ordering_fields, and get_latest_by are all included in the Meta class for backwards compatibility with pre-1.6 versions of Django.
22. unique_together is a tuple of tuples, where each tuple is a list of field names that, taken together, must be unique.
23. index_together is similar to unique_together, but for creating database indexes.
24. permissions is a list of (name, permission) tuples where name is the name of the permission you’re creating and permission is either a permission object or a tuple of (app_label, codename).
25. default_permissions is a list of permission names that will be created for this model by Django when you run manage.py syncdb.
26. select_on_save is a boolean that controls whether Django will emit a SELECT query after an INSERT or UPDATE query that modifies the table.
27. db_tablespace is the name of the database tablespace to use for this model.
28. managed is a boolean that controls whether Django will create, modify, and delete the database tables for your models automatically; if you leave it set to True, Django will do this for you automatically when you run manage.py syncdb.
29. abstract is a boolean that controls whether to create a database table for this model. If you set this to True, no database table will be created for this model. This is useful if you want to put some extra fields on a few of your models but not all of them.
30. app_label is the name of the application the model lives in.
31. db_table is the name of the database table to use for the model.
32. managed is a boolean that controls whether Django will