#

## Django documentation

# 14. Using a custom primary key

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'}

    # 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}

## Comments

## Post a comment

Note: Please only use the comments for questions/critcisms/suggestions on the docs; if you experience errors please file a ticket, ask in the IRC channel, or post to the django-users list. Comments will be periodically reviewed, integrated into the documentation proper, and removed.

Your name:

Comment: