Skip to main content

Create a clone of a django model instance.

Project description

4FC889E9-FF59-4E44-9EB6-2AF7DC034C74

Python Django Downloads Code Style
PyPI - Python Version PyPI - Django Version Downloads Code style: black
PyPI Test Vulnerabilities Coverage Code Quality Pre-Commit
PyPI version Test Known Vulnerabilities Codacy Badge
codecov
Codacy Badge pre-commit.ci status

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

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 attrs kwargs.

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

Screenshot

Change View

Screenshot

CloneModelAdmin class attributes

NOTE: :warning:

  • Ensure that model_clone is placed before django.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:

Buy me a coffee

Contributors ✨

Thanks goes to these wonderful people:

Gerben Neven
Gerben Neven

🐛 ⚠️ 💻
Sebastian Kapunkt
Sebastian Kapunkt

💻 🐛 ⚠️
Andrés Portillo
Andrés Portillo

🐛
WhiteSource Renovate
WhiteSource Renovate

🚧
Yuekui
Yuekui

💻 🐛 ⚠️ 📖 🚧
Take Weiland
Take Weiland

⚠️ 🐛 💻
Patrick
Patrick

🐛 💻
Amiel Kollek
Amiel Kollek

💻 🐛 ⚠️
Eric Theise
Eric Theise

📖
Daniel Schaffer
Daniel Schaffer

💻 ⚠️
Damian Barabonkov
Damian Barabonkov

💻 ⚠️

This project follows the all-contributors specification. Contributions of any kind welcome!

Project details


Release history Release notifications | RSS feed

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

django_clone-5.5.0.tar.gz (32.9 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

django_clone-5.5.0-py3-none-any.whl (17.7 kB view details)

Uploaded Python 3

File details

Details for the file django_clone-5.5.0.tar.gz.

File metadata

  • Download URL: django_clone-5.5.0.tar.gz
  • Upload date:
  • Size: 32.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.3

File hashes

Hashes for django_clone-5.5.0.tar.gz
Algorithm Hash digest
SHA256 93c991dc81d67b762f46362e09b2521c54d93662637bd5f862c7adaf9f80897a
MD5 1a7f65dcef2ff63b524a9872fbdd8eaa
BLAKE2b-256 27c9d63b882ceef6106726af3f2ae936d443bd454c4e5ba95b4bc6ba1c32f59c

See more details on using hashes here.

File details

Details for the file django_clone-5.5.0-py3-none-any.whl.

File metadata

  • Download URL: django_clone-5.5.0-py3-none-any.whl
  • Upload date:
  • Size: 17.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.3

File hashes

Hashes for django_clone-5.5.0-py3-none-any.whl
Algorithm Hash digest
SHA256 707aac2ebc3962690b6f6f6866833c8ab36798257d7f36221cf52296fbf3f0e0
MD5 3d815798a4b9fdb1ce2b9615576a7391
BLAKE2b-256 b219c63ba450c9b483540f6b83e8ba2e7b5c404f23bcbe48737ad3cc6f1c9f67

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page