#30080: New optional settings - disable bulk_create in all managers and call
self.full_clean() before saving the models
-----------------------------------------+------------------------
Reporter: uri-rodberg | Owner: nobody
Type: New feature | Status: new
Component: Uncategorized | Version: 2.1
Severity: Normal | Keywords:
Triage Stage: Unreviewed | Has patch: 0
Needs documentation: 0 | Needs tests: 0
Patch needs improvement: 0 | Easy pickings: 0
UI/UX: 0 |
-----------------------------------------+------------------------
We are using Django for [https://github.com/speedy-net/speedy-net Speedy
Net and Speedy Match] (currently Django 1.11.18, we can't upgrade to a
newer version of Django because of one of our requirements, django-
modeltranslation). I want to validate each model before saving it to the
database, so I'm using `class ValidateModelMixin` as the base of each
model.
For this reason, I want to disable `bulk_create` in all managers in all of
our models. So I added this code:
{{{#!python
class ValidateModelMixin(object):
def save(self, *args, **kwargs):
"""Call `full_clean` before saving."""
self.full_clean()
return super().save(*args, **kwargs)
class ManagerMixin(object):
def bulk_create(self, *args, **kwargs):
raise NotImplementedError("bulk_create is not implemented.")
class BaseModel(ValidateModelMixin, models.Model):
def save(self, *args, **kwargs):
try:
field = self._meta.get_field('id')
if ((not (self.id)) and (hasattr(field, 'id_generator'))):
self.id = field.id_generator()
while
(self._meta.model.objects.filter(id=self.id).exists()):
self.id = field.id_generator()
except FieldDoesNotExist:
pass
return super().save(*args, **kwargs)
class Meta:
abstract = True
class TimeStampedModel(BaseModel):
date_created = models.DateTimeField(auto_now_add=True, db_index=True)
date_updated = models.DateTimeField(auto_now=True, db_index=True)
class Meta:
abstract = True
class BaseManager(ManagerMixin, models.Manager):
pass
class BaseUserManager(ManagerMixin, DjangoBaseUserManager):
pass
}}}
I thought maybe it's good to add these settings - disable `bulk_create` in
all managers and call `self.full_clean()` before saving the models - as an
optional settings both in the project and also in each model (maybe in
`class Meta`) so it will be possible to override Django's default both
per-project and also for any specific model. I understand that the default
is not to call `self.full_clean()` before saving the models and to allow
`bulk_create` in the managers, but I suspect this may lead to invalid data
in the database of the projects.
The current code in the master is on https://github.com/speedy-net/speedy-
net/blob/master/speedy/core/base/models.py, and the code in the branch I'm
currently working on is on https://github.com/speedy-net/speedy-
net/blob/uri_merge_with_master_2019-01-05_a/speedy/core/base/models.py.
--
Ticket URL: <https://code.djangoproject.com/ticket/30080>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.
--
You received this message because you are subscribed to the Google Groups
"Django updates" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/django-updates/054.bef2301f11c097fc6a8247339e28b1d5%40djangoproject.com.
For more options, visit https://groups.google.com/d/optout.