|
7 | 7 | from django.db.models.base import ModelBase |
8 | 8 | from contextlib import suppress |
9 | 9 | from zipfile import ZipFile |
10 | | -from django.db.models import ( |
11 | | - F, |
12 | | - Func, |
13 | | - Value, |
14 | | - JSONField |
15 | | -) |
16 | 10 |
|
17 | 11 | # Import your package here. |
18 | 12 |
|
@@ -451,28 +445,48 @@ def _signal(self, model=None): |
451 | 445 |
|
452 | 446 | translate, field, auto_update = self._model_set(model=model) |
453 | 447 |
|
454 | | - if not auto_update: |
| 448 | + if not all([translate, field, auto_update]): |
455 | 449 | return self |
456 | 450 |
|
457 | 451 | languages = self.get_languages() |
| 452 | + objects = [] |
| 453 | + queryset = model.objects.all() |
| 454 | + |
| 455 | + for element in queryset: |
| 456 | + i18n = getattr(element, field, None) |
| 457 | + |
| 458 | + if not i18n: |
| 459 | + continue |
458 | 460 |
|
459 | | - x = model.objects.values_list(field, 'id') |
460 | | - for i18n, _id in x: |
461 | 461 | keys = list(i18n.keys()) |
462 | | - difference = list(set(languages).difference(keys)) |
| 462 | + difference_to_update = list(set(languages).difference(keys)) |
| 463 | + difference_to_delete = list(set(keys).difference(languages)) |
463 | 464 |
|
464 | | - if not difference: |
| 465 | + if not difference_to_update and not difference_to_delete: |
465 | 466 | continue |
466 | 467 |
|
467 | | - payload = {} |
468 | | - for language in difference: |
469 | | - payload.update({language: {}}) |
| 468 | + for language in difference_to_delete: |
| 469 | + i18n.pop(language, None) |
470 | 470 |
|
471 | | - for translate_field in translate: |
472 | | - payload[language].update({translate_field: ''}) |
| 471 | + for language in difference_to_update: |
| 472 | + i18n.update({language: {}}) |
473 | 473 |
|
474 | | - i18n.update(**payload) |
475 | | - model.objects.filter(id=_id).update(**{field: i18n}) |
| 474 | + for translate_field in translate: |
| 475 | + i18n[language].update({translate_field: ''}) |
| 476 | + |
| 477 | + # Set updatable field |
| 478 | + setattr(element, field, i18n) |
| 479 | + objects.append(element) |
| 480 | + |
| 481 | + # Bulk update model objects |
| 482 | + if length := len(objects): |
| 483 | + model.objects.bulk_update( |
| 484 | + objs=objects, |
| 485 | + fields=[ |
| 486 | + field, |
| 487 | + ], |
| 488 | + batch_size=length, |
| 489 | + ) |
476 | 490 |
|
477 | 491 |
|
478 | 492 | # Export localize instance |
|
0 commit comments