Create a clone of a django model instance.
Project description
PyPI | Python | Django | LICENSE |
---|---|---|---|
Test | Vulnerabilities | Coverage | Code Quality | Contributors | Code Style |
---|---|---|---|---|---|
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.utils 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
Change View
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 beforedjango.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
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Filename, size | File type | Python version | Upload date | Hashes |
---|---|---|---|---|
Filename, size django_clone-1.1.10-py3-none-any.whl (15.6 kB) | File type Wheel | Python version py3 | Upload date | Hashes View |
Filename, size django-clone-1.1.10.tar.gz (19.9 kB) | File type Source | Python version None | Upload date | Hashes View |
Close
Hashes for django_clone-1.1.10-py3-none-any.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 0224c3a010a757558086a1950ee61dfd6dbb67540dfd8fcddbee31853cf1bb19 |
|
MD5 | ea53631914a955eaf52b006776c4aa44 |
|
BLAKE2-256 | 16232151c3fe35a2e208719153fd295482fde01daddcdb388f93123b620a5eb1 |