#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 django-updates+unsubscr...@googlegroups.com.
To post to this group, send email to django-updates@googlegroups.com.
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.

Reply via email to