Skip to main content

Create a clone of a django model instance.

Project description

PyPI version CircleCI All Contributors PyPI - Django Version PyPI - Python Version Codacy Badge PyPI - License Codacy Badge Known Vulnerabilities

django-clone

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

Table of contents

Installation

pip install django-clone

Add model_clone to your INSTALLED_APPS

INSTALLED_APPS = [
    ...
    'model_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.tags.create(name='men')

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

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

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

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

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

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

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

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

CloneMixin attributes


  • Explicit field names

_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 include all except these fields.

_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.tags.create(name='men')

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

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

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

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

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

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',
    '...',
]

Contributors ✨

Thanks goes to these wonderful people:

Gerben Neven
Gerben Neven

🐛 ⚠️ 💻
Sebastian Kapunkt
Sebastian Kapunkt

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

🐛

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

Uploaded Source

Built Distribution

django_clone-0.1.3-py3-none-any.whl (21.7 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: django-clone-0.1.3.tar.gz
  • Upload date:
  • Size: 26.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.1.1 pkginfo/1.5.0.1 requests/2.23.0 setuptools/41.6.0 requests-toolbelt/0.9.1 tqdm/4.45.0 CPython/3.7.3

File hashes

Hashes for django-clone-0.1.3.tar.gz
Algorithm Hash digest
SHA256 981e930e277fa45031b1f3156d9bebe82b6057b8d7e65aafb8eb654e9cca4a30
MD5 a26b383afa4703d51e873d1795309bec
BLAKE2b-256 41d54a8de7b2319fde6307bae30fa5ce34a1bde5e3e137853f4befe67895c773

See more details on using hashes here.

File details

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

File metadata

  • Download URL: django_clone-0.1.3-py3-none-any.whl
  • Upload date:
  • Size: 21.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.1.1 pkginfo/1.5.0.1 requests/2.23.0 setuptools/41.6.0 requests-toolbelt/0.9.1 tqdm/4.45.0 CPython/3.7.3

File hashes

Hashes for django_clone-0.1.3-py3-none-any.whl
Algorithm Hash digest
SHA256 bcada7aedc1c29106ddd10bb6fa1c84f7bbbbea02add613bc7070e0b75fb7712
MD5 1cf134198f43e802ac09d6024a848a37
BLAKE2b-256 34435cd426f4250df6cbfeb5e7de67202fb200aa062232b1b1176dbe5f8d5393

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