Opened 13 years ago
Closed 11 years ago
#18389 closed Bug (fixed)
Field type attributes not permitted on models
| Reported by: | Owned by: | drtyrsa | |
|---|---|---|---|
| Component: | Database layer (models, ORM) | Version: | 1.4 | 
| Severity: | Normal | Keywords: | |
| Cc: | Triage Stage: | Accepted | |
| Has patch: | yes | Needs documentation: | no | 
| Needs tests: | no | Patch needs improvement: | no | 
| Easy pickings: | no | UI/UX: | no | 
Description
I have a situation where I need to reference a django model-field type in my models, something that would look like the following:
from django.db import models class MyModel(models.Model): referenced_field = models.CharField # ... field declarations here
The omission of parenthesis on the CharField is intentional. I do not want to create a field on this model, I simply need to reference a field type that this model is associated with.
Unfortunately this causes a type error:
TypeError: Error when calling the metaclass bases
    unbound method contribute_to_class() must be called with AutoField instance as first argument (got ModelBase instance instead)
This is down to ModelBase.add_to_class being overly naive in the way it calls contribute_to_class (it uses hasattr to check for things that define contribute_to_class, but doesn't care if they're types or objects).
One solution to this problem would be to change the class attribute in to a classmethod, but the problem seems a little unnecessary and feels like it should be cleaned up regardless. Unfortunately, I'm not sure what the ideal solution would be for this case, else I'd already have submit a patch.
Change History (5)
comment:1 by , 13 years ago
| Type: | Uncategorized → Bug | 
|---|
comment:2 by , 13 years ago
comment:3 by , 13 years ago
| Triage Stage: | Unreviewed → Accepted | 
|---|
comment:4 by , 11 years ago
| Has patch: | set | 
|---|---|
| Owner: | changed from to | 
| Status: | new → assigned | 
Here is pull request: https://github.com/django/django/pull/2658
I don't check that the method is bound, I check that the object that has this attribute is an instance, not a class, I think it's more tranparent and has this case covered.
comment:5 by , 11 years ago
| Resolution: | → fixed | 
|---|---|
| Status: | assigned → closed | 
Maybe the resolution here is that anything with contribute_to_class will be tried for add to class. This could be solved if the contribute_to_class method must be a bound method by checking for
value.contribute_to_class.__self__is not None.