Django documentation

14. Using a custom primary key

These docs are frozen for Django version 0.91. For current documentation, go here.

By default, Django adds an "id" field to each model. But you can override this behavior by explicitly adding primary_key=True to a field.

Model source code

from django.core import meta

class Employee(meta.Model):
    employee_code = meta.CharField(maxlength=10, primary_key=True)
    first_name = meta.CharField(maxlength=20)
    last_name = meta.CharField(maxlength=20)
    class META:
        ordering = ('last_name', 'first_name')

    def __repr__(self):
        return "%s %s" % (self.first_name, self.last_name)

class Business(meta.Model):
    name = meta.CharField(maxlength=20, primary_key=True)
    employees = meta.ManyToManyField(Employee)
    class META:
        verbose_name_plural = 'businesses'
        module_name = 'businesses'

    def __repr__(self):
        return self.name

API reference

Employee objects have the following methods:

  • delete()
  • get_business()
  • get_business_count()
  • get_business_list()
  • save()
  • set_businesses()

Business objects have the following methods:

  • delete()
  • get_employee_list()
  • save()
  • set_employees()

Sample API usage

This sample code assumes the above models have been saved in a file examplemodel.py.

>>> from django.models.examplemodel import employees, businesses

>>> dan = employees.Employee(employee_code='ABC123', first_name='Dan', last_name='Jones')
>>> dan.save()
>>> employees.get_list()
[Dan Jones]

>>> fran = employees.Employee(employee_code='XYZ456', first_name='Fran', last_name='Bones')
>>> fran.save()
>>> employees.get_list()
[Fran Bones, Dan Jones]

>>> employees.get_object(pk='ABC123')
Dan Jones
>>> employees.get_object(pk='XYZ456')
Fran Bones
>>> employees.get_object(pk='foo')
Traceback (most recent call last):
    ...
EmployeeDoesNotExist: Employee does not exist for {'pk': 'foo', 'order_by': ()}

# Fran got married and changed her last name.
>>> fran = employees.get_object(pk='XYZ456')
>>> fran.last_name = 'Jones'
>>> fran.save()
>>> employees.get_list(last_name__exact='Jones')
[Dan Jones, Fran Jones]
>>> employees.get_in_bulk(['ABC123', 'XYZ456'])
{'XYZ456': Fran Jones, 'ABC123': Dan Jones}

>>> b = businesses.Business(name='Sears')
>>> b.save()
>>> b.set_employees([dan.employee_code, fran.employee_code])
True
>>> b.get_employee_list()
[Dan Jones, Fran Jones]
>>> fran.get_business_list()
[Sears]
>>> businesses.get_in_bulk(['Sears'])
{'Sears': Sears}