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


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


pip install django-clone

Add model_clone to your INSTALLED_APPS



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 _(

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]:
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]:
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]:
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]:
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.


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

class ModelToCloneAdmin(ModelAdmin):


from model_clone import ClonableModelAdmin

class ModelToCloneAdmin(ClonableModelAdmin):

List View


Change View



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


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

Download files

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

Files for django-clone, version 0.0.8
Filename, size File type Python version Upload date Hashes
Filename, size django_clone-0.0.8-py3-none-any.whl (15.9 kB) File type Wheel Python version py3 Upload date Hashes View hashes
Filename, size django-clone-0.0.8.tar.gz (16.6 kB) File type Source Python version None Upload date Hashes View hashes

Supported by

Elastic Elastic Search Pingdom Pingdom Monitoring Google Google BigQuery Sentry Sentry Error logging AWS AWS Cloud computing DataDog DataDog Monitoring Fastly Fastly CDN SignalFx SignalFx Supporter DigiCert DigiCert EV certificate StatusPage StatusPage Status page