Django semi-DRY Fields
Published:
DRY fields
So, your app is growing nicely, but you find yourself repeating the same field
definition in a bunch of models.
The models themselves have nothing to do with each other, so an abstract base
class isn't a fit, but at various points you want, say, prices to always be the
same configuration of DecimalField, or titles to always allow the same size.
So, you could sub-class the fields to produce your own pre-configured fields,
but sometimes you want to vary them a little... this price is nullable, that
title has help_text, and so on.
Partially done
Enter the joy of functools.partial
Here's a little sample from a project I'm currently working on:
import functools
PriceField = functools.partial(
models.DecimalField,
decimal_places=2,
max_digits=10,
)
So what have we got here? Now, on my models I can put:
class MyModel(models.Model):
price = PriceField()
tax = PriceField(
null=True,
blank=True,
help_text='Where applicable.',
)
So, now my two fields are DecimalFields, with the same digits, etc., but some differences.
How about an even more common case:
from django.utils import timezone
AutoDateTimeField = functools.partial(
models.DateTimeField,
default=timezone.now,
)
Kitty Litter