Skip to main content

django-compositepk-model

日本語

Provide an extended Django Model class named 'CPkModel' that supports composite primary keys. Also provide an extended Query class 'CPkQuery' that supports multi-column lookups.

This package supports treating legacy db tables with a composite primary key, without adding a surrogate key.

This is my other approach to ticket373.

Features

1. Easy to use

For a table with a composite primary key, change the base class from Model to CPkModel, and set 'unique_together' in Meta. In addition, set 'primary_key=True' to each primary keys.

(model definition sample)

from django.db import models
from cpkmodel import CPkModel

# Normal Model
#   primary_key is auto 'id'
class Company(models.Model):
    name = models.CharField(max_length=100)
    established_date = models.DateField()
    company_code = models.CharField(max_length=100)

    class Meta:
        db_table = 'Company'

# Child Model (CpkModel)
#   composite primary key: company_id, country_code
class CompanyBranch(CPkModel):
    company = models.ForeignKey(
        Company,
        primary_key=True,       # for CompositePK
        on_delete=models.CASCADE,
    )
    country_code = models.CharField(
        max_length=100,
        primary_key=True,       # for CompositePK
    )
    name = models.CharField(max_length=100)
    established_date = models.DateField()

    class Meta:
        managed = False  # for CompositePK *1
        db_table = 'CompanyBranch'
        unique_together = (('company', 'country_code'),)  # for CompositePK

That's all. No additional definitions or virtual fields are required.

*1: "Migration" will fail because "primary_key=True" to multi-column unless "managed = False". Legacy tables already exisit, or have to be created by hand. Or, comment out "primary_key=True" and "managed=False" while migration.

2. Admin avairable

CPkModel can be used in Django Admin. The values of composite primary key are displayed in a comma separated style. Change(Update), Delete are fine. Add(Create) has a problem that CreateView do unique check to each key Field. So you can't add enough child records. But, this is only CreateView's problem. Your program can create child records by QuerySet or Model method.

3. Multi-column lookup avairable

To support composite primary keys, CPkQuery supports multi-column lookups.

obj = CompanyBranch.objects.get(pk=(1,'JP'))
qs = CompanyBranch.objects.filter(pk='1,JP')
qs = CompanyBranch.objects.filter(**{'company,country_code':(1,'JP')})
qs = CompanyBranch.objects.filter(**{'company_id,country_code':'1,JP'})

LHS with comma is not just primary, also other columns are OK.

qs = CompanyBranch.objects.filter(**{'country_code,name':'JP,Google'})

Lookup Multi-Column with 'in' is also avairable. PostgreSQL is fine, But SQLite3 is not supported.

qs = CompanyBranch.objects.filter(pk__in=[(1,'JP'),(1,'US'),(2,'JP'),])
qs = CompanyBranch.objects.filter(**{'country_code,name__in':[('JP','HONDA'),('CN','SONY'),]})

4. bulk_update avairable (v1.0.2)

bulk_update methond avairable for PostgreSQL. But SQLite3 is not supported.

   Album.objects.bulk_update(albums, ['num_stars',])

Limitations

1. Migration(Create table)

Migration will fail because "primary_key=True" to multi-column unless "managed = False". Legacy tables already exisit, or have to be created by hand. Otherwise, comment out "primary_key=True" and "managed=False" while migration.

2. Create in Admin(CreateView's problem)

CreateView do unique check to each key Field. So you can't add enough child records. But, this is only CreateView's problem. Your program can create child records by QuerySet or Model method.

3. ForeignKey

Need to make CPkForeignKey to support relations to GrandChild model.

4. Multi-column IN query not available for SQLite

Django model doesn't support multi-column "IN" query for SQLite at present.

5. Create is better than Save for INSERT

For INSERT, you'd better use CPKQuerySet.create rather than CPKModel.save. Because Model.save will try to UPDATE first if key value is set. Another way to avoid this, you can use option force_insert=True.

CompanyBranch.objects.create(**params)

 or 
 
obj = CompanyBranch(**params)
obj.save(force_insert=True)

Installation

pip install django-compositepk-model

Downloads

Links

https://code.djangoproject.com/ticket/373
https://code.djangoproject.com/wiki/MultipleColumnPrimaryKeys
https://gijutsu.com/en/2021/01/19/django-composite-primary-key/
https://gijutsu.com/en/2021/03/16/django-ticket373/

Release files for django-compositepk-model 1.0.3

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for django-compositepk-model 1.0.3
File Size Uploaded
django_compositepk_model-1.0.3.tar.gz 10.4 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for django-compositepk-model 1.0.3
File Interpreter ABI Platform
django_compositepk_model-1.0.3-py3-none-any.whl Python 3 none any Details

Total release size: 19.7 kB

Release files / django_compositepk_model-1.0.3.tar.gz

Download URL django_compositepk_model-1.0.3.tar.gz
Size 10.4 kB
Tags Source
SHA-256 checksum
How to use checksums
69c45a6b306da97f8caa6b19e8191fed4ed9ae800d4edcff7381bbae432454b0
BLAKE2b-256 checksum
How to use checksums
d9c38e40200ed12166bc1934217703868b8de94e2c1b1a1879962ad7d5f0dd70
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/5.0.0 CPython/3.12.3

Release files / django_compositepk_model-1.0.3-py3-none-any.whl

Download URL django_compositepk_model-1.0.3-py3-none-any.whl
Size 9.3 kB
Tags Python 3
SHA-256 checksum
How to use checksums
347f68eef2d7d34c2885cfd1642d6e5b036d7dd39f40bacd3eb961ec564edf88
BLAKE2b-256 checksum
How to use checksums
28defe2597dcacd3981f3b885d7771f7057072c425a5c574ebaa1f6b15c754a4
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/5.0.0 CPython/3.12.3

Release history Release notifications | RSS feed

This release

1.0.3 This release

2 release files

1.0.2

2 release files

1.0.1

2 release files

1.0.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page