| Python | Django | Downloads | Code Style |
|---|---|---|---|
| PyPI | Test | Vulnerabilities | Coverage | Code Quality | Pre-Commit |
|---|---|---|---|---|---|
django-clone
Create copies of a model instance with explicit control on how the instance should be duplicated (limiting fields or related objects copied) with unique field detection.
This solves the problem introduced by using instance.pk = None and instance.save() which results in copying more object state than required.
Features
- 100% test coverage.
- More control over how a model instance should be duplicated
- Multi Database support i.e Create duplicates on one or more databases.
- Restrict fields used for creating a duplicate instance.
- Detects unique fields and naively adds a suffix
copy {count}to each duplicate instance (for supported fields only). - Optionally differentiate between a duplicate instance and the original by appending a copy suffix to non unique fields (for supported fields only).
Table of Contents
- Installation
- Usage
- Advanced Usage
- Compatibility
- Running locally
- Found a Bug?
- Contributors ✨
Installation
pip
pip install django-clone
poetry
poetry add django-clone
Usage
Subclassing the CloneModel
Using the CloneMixin
Using the CloneModel
Duplicating a model instance
Bulk cloning a model
Creating clones without subclassing CloneMixin.
NOTE: :warning:
- This method won't copy over related objects like Many to Many/One to Many relationships.
- Ensure that required fields skipped from being cloned are passed in using the
attrskwargs.
CloneMixin attributes
| Attribute | Description |
|---|---|
DUPLICATE_SUFFIX |
Suffix to append to duplicates (NOTE: This requires USE_DUPLICATE_SUFFIX_FOR_NON_UNIQUE_FIELDS to be enabled and supports string fields). |
USE_DUPLICATE_SUFFIX_FOR_NON_UNIQUE_FIELDS |
Enable appending the DUPLICATE_SUFFIX to new cloned instances. |
UNIQUE_DUPLICATE_SUFFIX |
Suffix to append to unique fields |
USE_UNIQUE_DUPLICATE_SUFFIX |
Enable appending the UNIQUE_DUPLICATE_SUFFIX to new cloned instances. |
MAX_UNIQUE_DUPLICATE_QUERY_ATTEMPTS |
The max query attempt while generating unique values for a case of unique conflicts. |
Explicit (include only these fields)
| Attribute | Description |
|---|---|
_clone_fields |
Restrict the list of fields to copy from the instance (By default: Copies all fields excluding auto-created/non editable model fields) |
_clone_m2m_fields |
Restricted Many to many fields (i.e Test.tags) |
_clone_m2o_or_o2m_fields |
Restricted Many to One/One to Many fields |
_clone_o2o_fields |
Restricted One to One fields |
_clone_linked_m2m_fields |
Restricted Many to Many fields that should be linked to the new instance |
Implicit (include all except these fields)
| Attribute | Description |
|---|---|
_clone_excluded_fields |
Excluded model fields. |
_clone_excluded_m2m_fields |
Excluded many to many fields. |
_clone_excluded_m2o_or_o2m_fields |
Excluded Many to One/One to Many fields. |
_clone_excluded_o2o_fields |
Excluded one to one fields. |
NOTE: :warning:
- Ensure to either set
_clone_excluded_*or_clone_*. Using both would raise errors.
Django Admin
Duplicating Models from the Django Admin view.
List View
Change View
CloneModelAdmin class attributes
NOTE: :warning:
- Ensure that
model_cloneis placed beforedjango.contrib.admin
INSTALLED_APPS = [
'model_clone',
'django.contrib.admin',
'...',
]
Advanced Usage
Signals
pre_clone_save, post_clone_save
Multi-database support
Compatibility
| Python | Supported version |
|---|---|
| Python2.x | <=2.5.3 |
| Python3.5 | <=2.9.6 |
| Python3.6+ | <=5.3.3 |
| Python3.7+ | All versions |
| Django | Supported version |
|---|---|
| 1.11 | <=2.7.2 |
| 2.x | All versions |
| 3.x | All versions |
| 4.x | All versions |
Running locally
$ git clone git@github.com:tj-django/django-clone.git
$ make default-user
$ make run
Spins up a django server running the demo app.
Visit http://127.0.0.1:8000
Found a Bug?
To file a bug or submit a patch, please head over to django-clone on github.
If you feel generous and want to show some extra appreciation:
Support me with a :star:
Contributors ✨
Thanks goes to these wonderful people:
This project follows the all-contributors specification. Contributions of any kind welcome!
Metadata
Release files for django-clone 5.5.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| django_clone-5.5.0.tar.gz | 32.9 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| django_clone-5.5.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 50.6 kB
Release files / django_clone-5.5.0.tar.gz
| Download URL | django_clone-5.5.0.tar.gz |
|---|---|
| Size | 32.9 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
93c991dc81d67b762f46362e09b2521c54d93662637bd5f862c7adaf9f80897a
|
|
BLAKE2b-256 checksum How to use checksums |
27c9d63b882ceef6106726af3f2ae936d443bd454c4e5ba95b4bc6ba1c32f59c
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.13.3
|
Release files / django_clone-5.5.0-py3-none-any.whl
| Download URL | django_clone-5.5.0-py3-none-any.whl |
|---|---|
| Size | 17.7 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
707aac2ebc3962690b6f6f6866833c8ab36798257d7f36221cf52296fbf3f0e0
|
|
BLAKE2b-256 checksum How to use checksums |
b219c63ba450c9b483540f6b83e8ba2e7b5c404f23bcbe48737ad3cc6f1c9f67
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.13.3
|