| Version 4 (modified by , 20 years ago) ( diff ) |
|---|
Django model syntax change
As of , Django's model syntax has changed. If you're using models that use old (pre-) syntax, you'll need to convert them according to the these instructions.
What changed
- Fields are now attributes of the model class, rather than members of a
fieldslist. - Meta information (anything that's NOT a field, such as
ordering,admin,unique_together, etc.) now goes in an inner class, calledMETA(note the all caps). This class doesn't have a parent class. - Each field is required to have an explicit name -- even
ForeignKeys,ManyToManyFields andOneToOneFields. This solves the problem of "How do I refer to my field from within admin.fields?" rel_nameis no longer used forForeignKeys. If your model has more than oneForeignKeyto the same foreign model, differentiate the fields using the field name, notrel_name. See Relating a model to another model more than once for an example.rel_nameis no longer used forManyToManyFields. If your model has more than oneManyToManyFieldto the same foreign model, differentiate the fields using the field name, notrel_name. Also, give both of theManyToManyFields asingularattribute, which defines the name of the related object in singular format. (This is an obscure case, but it's included here for completeness.)
Examples
Old syntax example
class Foo(meta.Model): fields = ( meta.CharField('first_name', "The person's first name", maxlength=30), meta.CharField('last_name', maxlength=30), meta.ForeignKey(Bar), meta.ManyToManyField(Sites), ) ordering = ('-bar_id',) admin = meta.Admin( fields = ( (None, {'fields': ('first_name', 'last_name', 'bar_id', 'sites')}), ), )
New syntax example
class Foo(meta.Model): first_name = meta.CharField("The person's first name", maxlength=30) last_name = meta.CharField(maxlength=30) bar = meta.ForeignKey(Bar) sites = meta.ManyToManyField(Sites) class META: ordering = ('-bar',) admin = meta.Admin( fields = ( (None, {'fields': ('first_name', 'last_name', 'bar', 'sites')}), ), )
Notes:
barandsitesnow have explicit names, andadmin.fieldswas changed to usebarinstead ofbar_id.orderingwas also changed to use the explicit namebarinstead ofbar_id.bar_idisn't used anywhere anymore; always use the explicit field name as defined in the model."sites"is the explicit field name for theSitesmany-to-many relationship. Previously, Django calculated this automatically by using themodule_nameof the related model by default, orrel_nameif it was given.- The
verbose_nameis now an optional first argument toFields. ForForeignKeys,ManyToManyFields andOneToOneFields, use a named argument:verbose_name="foo". - Don't forget to remove the commas after each
Field, because they're class attributes instead of list elements now.
Note:
See TracWiki
for help on using the wiki.