'Why does Django use `Meta` inner class in models?
If I want to describe some information such as ordering, if the model is proxy or abstract, which fields must be unique together, then I need to put this information in class named Meta
that is inside of my model class. But if I want to change the manager I put information about it in the model class itself.
class Product(models.Model):
class Meta:
unique_together = ...
ordering = ...
objects = My manager()
Why did Django developers made such design decision (forcing to put some information about the model in the Meta
inner class instead of the model class itself)? Why wouldn't they just let me put "ordering", "uniwue_tpgether" in the model class itself?
EDIT: Anentropic commented about it being a kind of namespacing. I thought about it while creating the question. If Meta
inner class is a way of namespacing metainformation about the model so I'm free to create fields in the model class itself then why wasn't objects
attribute put in the Meta
class? There are many more attributes (save
, refresh_from_db
, get_deffered_fields
, and more) that exist in the model class itself rather than in the Meta
class that can collide with my field names if I dont know about them.
Solution 1:[1]
It's probably to avoid conflicts with field names. For example, by putting ordering
into the Meta
class, you are still free to have a field named ordering
on your model.
But then, why is the manager, named objects
in the example, not in Meta
as well? The reason is probably that you can access it as Product.objects
, which is unlike any other Meta
field. Moreover, the manager can have a custom name, for example Product.products
.
You mentioned that there might also be conflicts with other class attributes besides meta fields, like methods. This is true, as mentioned in the documentation:
Be careful not to choose field names that conflict with the models API like
clean
,save
, ordelete
.
The risk of a conflict is quite small here, because methods usually have a verb in their name, like save
or get
, whereas field names are typically nouns, like name
, id
or price
.
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
Solution | Source |
---|---|
Solution 1 | Thomas |