Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is there a way to auto-increment a Django field with respect to a foreign key?

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.

like image 246
One Crayon Avatar asked Feb 07 '09 02:02

One Crayon


People also ask

How does ForeignKey work in Django?

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.

How do you Autoincrement a field in 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.

Can a model have two foreign keys in Django?

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.


1 Answers

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

like image 141
Tiago Avatar answered Sep 24 '22 13:09

Tiago