I'm currently coding a site in Django (because you can never learn too many frameworks!), and am wondering if there's a way to auto-increment an object with respect to a related object. So for instance, say I have an Entry model and an EntryVersion model:
Entry
- title
- slug
EntryVersion
- entry (foreign key)
- version_number
- content
I want to auto-increment version_number
with respect to the entry foreign key (so that an entry might have several versions, starting at one and moving upwards by one). It won't be a true auto-increment, though, because it won't be unique in the database (there might be many entry versions with version_number = 1; just only one for a given Entry).
I know that I could roll my own admin and just handle this there, but was wondering if there were any way to have the Django admin automatically increase the version number by one whenever a new entry version is saved.
Edit: specific code that I used (corrected to only set version number on first save)
Tiago's answer was right, but in the interest of future StackOverflow users with similar dilemmas, here's the specific code that I used:
def save(self, force_insert=False, force_update=False):
# Only modify number if creating for the first time (is default 0)
if self.version_number == 0:
# Grab the highest current index (if it exists)
try:
recent = EntryVersion.objects.filter(entry__exact=self.entry).order_by('-version_number')[0]
self.version_number = recent.version_number + 1
except IndexError:
self.version_number = 1
# Call the "real" save() method
super(EntryVersion, self).save(force_insert, force_update)
The order_by
w/ index trick is one I gleaned from the Django documentation here:
http://docs.djangoproject.com/en/dev/topics/db/queries/#id4
Note that you must have default=0
defined on your version_number
field for this to work.
There may be a better way, but this seems to be working exactly the way I needed; hopefully others will also find it useful.
ForeignKey is a Django ORM field-to-column mapping for creating and working with relationships between tables in relational databases. ForeignKey is defined within the django.
If the verbose name isn't given, Django will automatically create it using the field's attribute name, converting underscores to spaces. A list of validators to run for this field. See the validators documentation for more information. If True, this field must be unique throughout the table.
Your intermediate model must contain one - and only one - foreign key to the target model (this would be Person in our example). If you have more than one foreign key, a validation error will be raised.
You can do this:
def save(self, force_insert=False, force_update=False): #if self.id is None: self.version_number += 1 super(EntryVersion, self).save(force_insert, force_update) # Call the "real" save() method.
which comes directly from here:
http://docs.djangoproject.com/en/dev/topics/db/models/#overriding-predefined-model-methods
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With