Skip to main content

Create a clone of a django model instance.

Project description

PyPI Python Django LICENSE
PyPI version PyPI - Python Version PyPI - Django Version PyPI - License
Test Vulnerabilities Coverage Code Quality Contributors
CircleCI Known Vulnerabilities Codacy Badge Codacy Badge All Contributors

django-clone

Creating copies of a model instance with explicit control on how the instance should be duplicated (limiting fields or related objects) copied and unique field detection.

Table of contents

Installation

Run

$ pip install django-clone

Usage

from django.db import models
from django.utils.translation import gettext_lazy as _
from model_clone import CloneMixin

class TestModel(CloneMixin, models.Model):
    title = models.CharField(max_length=200)
    tags =  models.ManyToManyField('Tags')

    _clone_many_to_many_fields = ['tags']


class Tags(models.Model):
    name = models.CharField(max_length=255)

    def __str__(self):
        return _(self.name)

Duplicating a model instance

In [1]: test_obj = TestModel.objects.create(title='New')

In [2]: test_obj.pk
Out[2]: 1

In [3]: test_obj.title
Out[3]: 'New'

In [4]: test_obj.tags.create(name='men')

In [4]: test_obj.tags.create(name='women')

In [5]: test_obj.tags.all()
Out[5]: <QuerySet [<Tag: men>, <Tag: women>]>

In [6]: clone = test_obj.make_clone(attrs={'title': 'Updated title'})

In [7]: clone.pk
Out[7]: 2

In [8]: clone.title
Out[8]: 'Updated title'

In [9]: clone.tags.all()
Out[9]: <QuerySet [<Tag: men>, <Tag: women>]>

CloneMixin attributes

Explicit
Field Names Description
_clone_model_fields Restrict the list of fields to copy from the instance (By default: Copies all fields excluding auto-created/non editable model fields)
_clone_many_to_many_fields Restricted Many to many fields (i.e Test.tags)
_clone_many_to_one_or_one_to_many_fields Restricted Many to One/One to Many fields
_clone_one_to_one_fields Restricted One to One fields
Implicit
Field Names (include all except these fields.) Description
_clone_excluded_model_fields Excluded model fields.
_clone_excluded_many_to_many_fields Excluded many to many fields.
_clone_excluded_many_to_one_or_one_to_many_fields Excluded Many to One/One to Many fields.
_clone_excluded_one_to_one_fields Excluded one to one fields.

:warning: NOTE: Ensure to either set _clone_excluded_* or _clone_*. Using both would raise errors.

Creating clones without subclassing CloneMixin.

In [1]: from model_clone import create_copy_of_instance

In [2]: test_obj = TestModel.objects.create(title='New')

In [3]: test_obj.pk
Out[3]: 1

In [4]: test_obj.title
Out[4]: 'New'

In [5]: test_obj.tags.create(name='men')

In [6]: test_obj.tags.create(name='women')

In [7]: test_obj.tags.all()
Out[7]: <QuerySet [<Tag: men>, <Tag: women>]>

In [8]: clone = create_copy_of_instance(test_obj, attrs={'title': 'Updated title'})

In [9]: clone.pk
Out[9]: 2

In [10]: clone.title
Out[10]: 'Updated title'

In [11]: clone.tags.all()
Out[11]: <QuerySet []>

:warning: NOTE:

  • 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 dictionary.

Duplicating Models from Django Admin view.

Change

from django.contrib import admin
from django.contrib.admin import ModelAdmin

@admin.register(TestModel)
class TestModelAdmin(ModelAdmin):
    pass

to

from model_clone import CloneModelAdmin

@admin.register(TestModel)
class TestModelAdmin(CloneModelAdmin):
    pass

List View

Screenshot

Change View

Screenshot

CLONE MODEL ADMIN CLASS PROPERTIES
from model_clone import CloneModelAdmin

@admin.register(TestModel)
class TestModelAdmin(CloneModelAdmin):
    # Enables/Disables the Duplicate action in the List view (Defaults to True)
    include_duplicate_action = True
    # Enables/Disables the Duplicate action in the Change view (Defaults to True)
    include_duplicate_object_link = True

:warning: NOTE: Ensure that model_clone is placed before django.contrib.admin

INSTALLED_APPS = [
    'model_clone',
    'django.contrib.admin',
    '...',
]

Found a Bug?

To file a bug or submit a patch, please head over to django-clone on github.

Contributors ✨

Thanks goes to these wonderful people:


Gerben Neven

🐛 ⚠️ 💻

Sebastian Kapunkt

💻 🐛 ⚠️

Andrés Portillo

🐛

WhiteSource Renovate

🚧

Yuekui

💻 🐛 ⚠️

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

Project details


Release history Release notifications | RSS feed

This version

1.1.7

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-1.1.7.tar.gz (19.3 kB view details)

Uploaded Source

Built Distribution

django_clone-1.1.7-py3-none-any.whl (15.5 kB view details)

Uploaded Python 3

File details

Details for the file django-clone-1.1.7.tar.gz.

File metadata

  • Download URL: django-clone-1.1.7.tar.gz
  • Upload date:
  • Size: 19.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.2.0 pkginfo/1.5.0.1 requests/2.24.0 setuptools/46.3.1 requests-toolbelt/0.9.1 tqdm/4.46.1 CPython/3.7.3

File hashes

Hashes for django-clone-1.1.7.tar.gz
Algorithm Hash digest
SHA256 97b3e8a6718a9e13389bc05d1a98403bb297d720657c6097585e3f294f0d89be
MD5 45c66631fce8a03ca47670121b2be51f
BLAKE2b-256 a94582c9a2ae64d3f1e71d9a81607287558889db7eb2b1e150e1ccf720b5138d

See more details on using hashes here.

File details

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

File metadata

  • Download URL: django_clone-1.1.7-py3-none-any.whl
  • Upload date:
  • Size: 15.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.2.0 pkginfo/1.5.0.1 requests/2.24.0 setuptools/46.3.1 requests-toolbelt/0.9.1 tqdm/4.46.1 CPython/3.7.3

File hashes

Hashes for django_clone-1.1.7-py3-none-any.whl
Algorithm Hash digest
SHA256 1598423b31b87dabd1dae1e27eea4fd7c33ee5c505248a1bf0b4549584ee0ede
MD5 ab1b55ca21c6f01492f9aab62fdd26ea
BLAKE2b-256 985846064d554f664b163bd9b52db687d4e82e55eb7203ddc2a508cda4f96ba5

See more details on using hashes here.

Supported by

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