Skip to main content

Create a clone of a django model instance.

Project description

CircleCI All Contributors PyPI - Python Version PyPI - License PyPI - Django Version

django-clone

Creating copies of a model instance on the fly offering more control on how the object should be cloned with support for limiting the fields or related objects copied.

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 Tags(models.Model):
    name = models.CharField(max_length=255)

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


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

    _clonable_many_to_many_fields = ['tags']

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

_clonable_model_fields: Restrict the list of fields to copy from the instance.
_clonable_many_to_many_fields: Restricted Many to many fields (i.e Test.tags).
_clonable_many_to_one_or_one_to_many_fields: Restricted Many to One/One to Many fields.
_clonable_one_to_one_fields: Restricted One to One fields.

Creating clones without subclassing CloneMixin.

:warning: This method won't copy over related objects like Many to Many/One to Many relationships.

:warning: Ensure that required fields skipped from being cloned are passed in using the attrs dictionary.

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 []>

Duplicating Models from Django Admin view.

Change

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

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

to

from model_clone import ClonableModelAdmin

@admin.register(TestModel)
class ModelToCloneAdmin(ClonableModelAdmin):
    pass

List View

Screenshot

Change View

Screenshot

SETTINGS

include_duplicate_action: Enables/Disables the Duplicate action in the List view (Defaults to True) include_duplicate_object_link: Enables/Disables the Duplicate action in the Change view (Defaults to True)

:warning: 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.0.6.tar.gz (10.8 kB view details)

Uploaded Source

Built Distribution

django_clone-0.0.6-py3-none-any.whl (15.9 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: django-clone-0.0.6.tar.gz
  • Upload date:
  • Size: 10.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/2.0.0 pkginfo/1.5.0.1 requests/2.22.0 setuptools/40.8.0 requests-toolbelt/0.9.1 tqdm/4.38.0 CPython/3.6.4

File hashes

Hashes for django-clone-0.0.6.tar.gz
Algorithm Hash digest
SHA256 0ed89aacffc19e996eca20b2727b11cd918c317d66cf35799a966d18a0f2b50c
MD5 89692c8ba1855575a0d616682ac941a5
BLAKE2b-256 fb6af69c58c478b88ebca7caf017a202f24ac6c22dcc956b5176bea72d199523

See more details on using hashes here.

File details

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

File metadata

  • Download URL: django_clone-0.0.6-py3-none-any.whl
  • Upload date:
  • Size: 15.9 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/2.0.0 pkginfo/1.5.0.1 requests/2.22.0 setuptools/40.8.0 requests-toolbelt/0.9.1 tqdm/4.38.0 CPython/3.6.4

File hashes

Hashes for django_clone-0.0.6-py3-none-any.whl
Algorithm Hash digest
SHA256 9427d0cb769ebcf5497539b0585f0ec2310daa0d3a833a2e53d8a56275b85297
MD5 fca0460c7350188633589fd4a33bd9b0
BLAKE2b-256 7e82160281d74ee8d5e3615d21618bb23ad2629888a6f7b4690f0f386c47b473

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