plain.models 0.41.1__py3-none-any.whl → 0.42.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- plain/models/CHANGELOG.md +17 -0
- plain/models/README.md +65 -22
- plain/models/__init__.py +0 -2
- plain/models/base.py +12 -34
- plain/models/cli.py +16 -22
- plain/models/constraints.py +1 -1
- plain/models/deletion.py +1 -1
- plain/models/fields/__init__.py +1 -1
- plain/models/fields/related.py +1 -4
- plain/models/fields/related_descriptors.py +57 -53
- plain/models/fields/related_lookups.py +2 -2
- plain/models/fields/reverse_related.py +1 -1
- plain/models/forms.py +1 -1
- plain/models/migrations/autodetector.py +0 -18
- plain/models/migrations/operations/__init__.py +0 -2
- plain/models/migrations/operations/models.py +3 -57
- plain/models/migrations/operations/special.py +2 -8
- plain/models/migrations/recorder.py +1 -1
- plain/models/migrations/serializer.py +0 -12
- plain/models/migrations/state.py +1 -55
- plain/models/options.py +23 -86
- plain/models/query.py +10 -41
- plain/models/query_utils.py +1 -1
- plain/models/sql/compiler.py +5 -5
- plain/models/sql/query.py +2 -2
- {plain_models-0.41.1.dist-info → plain_models-0.42.0.dist-info}/METADATA +66 -23
- {plain_models-0.41.1.dist-info → plain_models-0.42.0.dist-info}/RECORD +30 -31
- plain/models/manager.py +0 -176
- {plain_models-0.41.1.dist-info → plain_models-0.42.0.dist-info}/WHEEL +0 -0
- {plain_models-0.41.1.dist-info → plain_models-0.42.0.dist-info}/entry_points.txt +0 -0
- {plain_models-0.41.1.dist-info → plain_models-0.42.0.dist-info}/licenses/LICENSE +0 -0
@@ -122,15 +122,13 @@ class ForwardManyToOneDescriptor:
|
|
122
122
|
def is_cached(self, instance):
|
123
123
|
return self.field.is_cached(instance)
|
124
124
|
|
125
|
-
def get_queryset(self
|
126
|
-
qs = self.field.remote_field.model.
|
127
|
-
qs._add_hints(**hints)
|
125
|
+
def get_queryset(self):
|
126
|
+
qs = self.field.remote_field.model._meta.base_queryset
|
128
127
|
return qs.all()
|
129
128
|
|
130
129
|
def get_prefetch_queryset(self, instances, queryset=None):
|
131
130
|
if queryset is None:
|
132
131
|
queryset = self.get_queryset()
|
133
|
-
queryset._add_hints(instance=instances[0])
|
134
132
|
|
135
133
|
rel_obj_attr = self.field.get_foreign_related_value
|
136
134
|
instance_attr = self.field.get_local_related_value
|
@@ -170,7 +168,7 @@ class ForwardManyToOneDescriptor:
|
|
170
168
|
)
|
171
169
|
|
172
170
|
def get_object(self, instance):
|
173
|
-
qs = self.get_queryset(
|
171
|
+
qs = self.get_queryset()
|
174
172
|
# Assuming the database enforces foreign keys, this won't fail.
|
175
173
|
return qs.get(self.field.get_reverse_related_filter(instance))
|
176
174
|
|
@@ -310,7 +308,7 @@ class ReverseManyToOneDescriptor:
|
|
310
308
|
related_model = self.rel.related_model
|
311
309
|
|
312
310
|
return create_reverse_many_to_one_manager(
|
313
|
-
related_model.
|
311
|
+
related_model.query.__class__,
|
314
312
|
self.rel,
|
315
313
|
)
|
316
314
|
|
@@ -347,24 +345,27 @@ def create_reverse_many_to_one_manager(superclass, rel):
|
|
347
345
|
"""
|
348
346
|
Create a manager for the reverse side of a many-to-one relation.
|
349
347
|
|
350
|
-
This manager
|
351
|
-
the related model, and adds behaviors specific to many-to-one relations.
|
348
|
+
This manager adds behaviors specific to many-to-one relations.
|
352
349
|
"""
|
353
350
|
|
354
|
-
class RelatedManager
|
351
|
+
class RelatedManager:
|
355
352
|
def __init__(self, instance):
|
356
|
-
super().__init__()
|
357
|
-
|
358
|
-
self.instance = instance
|
359
353
|
self.model = rel.related_model
|
354
|
+
self.instance = instance
|
360
355
|
self.field = rel.field
|
361
|
-
|
362
356
|
self.core_filters = {self.field.name: instance}
|
357
|
+
# Store the base queryset class for this model
|
358
|
+
self.base_queryset_class = rel.related_model._meta.queryset.__class__
|
363
359
|
|
364
|
-
|
365
|
-
|
366
|
-
|
367
|
-
|
360
|
+
@property
|
361
|
+
def query(self):
|
362
|
+
"""
|
363
|
+
Access the QuerySet for this relationship.
|
364
|
+
|
365
|
+
Example:
|
366
|
+
parent.children.query.filter(active=True)
|
367
|
+
"""
|
368
|
+
return self.get_queryset()
|
368
369
|
|
369
370
|
def _check_fk_val(self):
|
370
371
|
for field in self.field.foreign_related_fields:
|
@@ -378,7 +379,6 @@ def create_reverse_many_to_one_manager(superclass, rel):
|
|
378
379
|
"""
|
379
380
|
Filter the queryset for the instance this manager is bound to.
|
380
381
|
"""
|
381
|
-
queryset._add_hints(instance=self.instance)
|
382
382
|
queryset._defer_next_filter = True
|
383
383
|
queryset = queryset.filter(**self.core_filters)
|
384
384
|
for field in self.field.foreign_related_fields:
|
@@ -430,14 +430,13 @@ def create_reverse_many_to_one_manager(superclass, rel):
|
|
430
430
|
self.field.remote_field.get_cache_name()
|
431
431
|
]
|
432
432
|
except (AttributeError, KeyError):
|
433
|
-
queryset
|
433
|
+
# Use the base queryset class for this model
|
434
|
+
queryset = self.base_queryset_class(model=self.model)
|
434
435
|
return self._apply_rel_filters(queryset)
|
435
436
|
|
436
437
|
def get_prefetch_queryset(self, instances, queryset=None):
|
437
438
|
if queryset is None:
|
438
|
-
queryset =
|
439
|
-
|
440
|
-
queryset._add_hints(instance=instances[0])
|
439
|
+
queryset = self.base_queryset_class(model=self.model)
|
441
440
|
|
442
441
|
rel_obj_attr = self.field.get_local_related_value
|
443
442
|
instance_attr = self.field.get_foreign_related_value
|
@@ -474,7 +473,7 @@ def create_reverse_many_to_one_manager(superclass, rel):
|
|
474
473
|
"the object first."
|
475
474
|
)
|
476
475
|
ids.append(obj.id)
|
477
|
-
self.model.
|
476
|
+
self.model._meta.base_queryset.filter(id__in=ids).update(
|
478
477
|
**{
|
479
478
|
self.field.name: self.instance,
|
480
479
|
}
|
@@ -488,17 +487,17 @@ def create_reverse_many_to_one_manager(superclass, rel):
|
|
488
487
|
def create(self, **kwargs):
|
489
488
|
self._check_fk_val()
|
490
489
|
kwargs[self.field.name] = self.instance
|
491
|
-
return
|
490
|
+
return self.base_queryset_class(model=self.model).create(**kwargs)
|
492
491
|
|
493
492
|
def get_or_create(self, **kwargs):
|
494
493
|
self._check_fk_val()
|
495
494
|
kwargs[self.field.name] = self.instance
|
496
|
-
return
|
495
|
+
return self.base_queryset_class(model=self.model).get_or_create(**kwargs)
|
497
496
|
|
498
497
|
def update_or_create(self, **kwargs):
|
499
498
|
self._check_fk_val()
|
500
499
|
kwargs[self.field.name] = self.instance
|
501
|
-
return
|
500
|
+
return self.base_queryset_class(model=self.model).update_or_create(**kwargs)
|
502
501
|
|
503
502
|
# remove() and clear() are only provided if the ForeignKey can have a
|
504
503
|
# value of null.
|
@@ -601,7 +600,7 @@ class ManyToManyDescriptor(ReverseManyToOneDescriptor):
|
|
601
600
|
related_model = self.rel.related_model if self.reverse else self.rel.model
|
602
601
|
|
603
602
|
return create_forward_many_to_many_manager(
|
604
|
-
related_model.
|
603
|
+
related_model.query.__class__,
|
605
604
|
self.rel,
|
606
605
|
reverse=self.reverse,
|
607
606
|
)
|
@@ -618,14 +617,11 @@ def create_forward_many_to_many_manager(superclass, rel, reverse):
|
|
618
617
|
"""
|
619
618
|
Create a manager for the either side of a many-to-many relation.
|
620
619
|
|
621
|
-
This manager
|
622
|
-
the related model, and adds behaviors specific to many-to-many relations.
|
620
|
+
This manager adds behaviors specific to many-to-many relations.
|
623
621
|
"""
|
624
622
|
|
625
|
-
class ManyRelatedManager
|
623
|
+
class ManyRelatedManager:
|
626
624
|
def __init__(self, instance=None):
|
627
|
-
super().__init__()
|
628
|
-
|
629
625
|
self.instance = instance
|
630
626
|
|
631
627
|
if not reverse:
|
@@ -643,6 +639,9 @@ def create_forward_many_to_many_manager(superclass, rel, reverse):
|
|
643
639
|
self.target_field_name = rel.field.m2m_field_name()
|
644
640
|
self.symmetrical = False
|
645
641
|
|
642
|
+
# Store the base queryset class for this model
|
643
|
+
self.base_queryset_class = self.model._meta.queryset.__class__
|
644
|
+
|
646
645
|
self.through = rel.through
|
647
646
|
self.reverse = reverse
|
648
647
|
|
@@ -671,12 +670,15 @@ def create_forward_many_to_many_manager(superclass, rel, reverse):
|
|
671
670
|
"a many-to-many relationship can be used."
|
672
671
|
)
|
673
672
|
|
674
|
-
|
675
|
-
|
676
|
-
|
677
|
-
|
678
|
-
|
679
|
-
|
673
|
+
@property
|
674
|
+
def query(self):
|
675
|
+
"""
|
676
|
+
Access the QuerySet for this relationship.
|
677
|
+
|
678
|
+
Example:
|
679
|
+
book.authors.query.filter(active=True)
|
680
|
+
"""
|
681
|
+
return self.get_queryset()
|
680
682
|
|
681
683
|
def _build_remove_filters(self, removed_vals):
|
682
684
|
filters = Q.create([(self.source_field_name, self.related_val)])
|
@@ -702,7 +704,6 @@ def create_forward_many_to_many_manager(superclass, rel, reverse):
|
|
702
704
|
"""
|
703
705
|
Filter the queryset for the instance this manager is bound to.
|
704
706
|
"""
|
705
|
-
queryset._add_hints(instance=self.instance)
|
706
707
|
queryset._defer_next_filter = True
|
707
708
|
return queryset._next_is_sticky().filter(**self.core_filters)
|
708
709
|
|
@@ -716,14 +717,13 @@ def create_forward_many_to_many_manager(superclass, rel, reverse):
|
|
716
717
|
try:
|
717
718
|
return self.instance._prefetched_objects_cache[self.prefetch_cache_name]
|
718
719
|
except (AttributeError, KeyError):
|
719
|
-
queryset =
|
720
|
+
queryset = self.base_queryset_class(model=self.model)
|
720
721
|
return self._apply_rel_filters(queryset)
|
721
722
|
|
722
723
|
def get_prefetch_queryset(self, instances, queryset=None):
|
723
724
|
if queryset is None:
|
724
|
-
queryset =
|
725
|
+
queryset = self.base_queryset_class(model=self.model)
|
725
726
|
|
726
|
-
queryset._add_hints(instance=instances[0])
|
727
727
|
queryset = _filter_prefetch_queryset(
|
728
728
|
queryset._next_is_sticky(), self.query_field_name, instances
|
729
729
|
)
|
@@ -785,8 +785,10 @@ def create_forward_many_to_many_manager(superclass, rel, reverse):
|
|
785
785
|
def clear(self):
|
786
786
|
with transaction.atomic(savepoint=False):
|
787
787
|
self._remove_prefetched_objects()
|
788
|
-
filters = self._build_remove_filters(
|
789
|
-
|
788
|
+
filters = self._build_remove_filters(
|
789
|
+
self.base_queryset_class(model=self.model)
|
790
|
+
)
|
791
|
+
self.through.query.filter(filters).delete()
|
790
792
|
|
791
793
|
def set(self, objs, *, clear=False, through_defaults=None):
|
792
794
|
# Force evaluation of `objs` in case it's a queryset whose value
|
@@ -820,12 +822,14 @@ def create_forward_many_to_many_manager(superclass, rel, reverse):
|
|
820
822
|
self.add(*new_objs, through_defaults=through_defaults)
|
821
823
|
|
822
824
|
def create(self, *, through_defaults=None, **kwargs):
|
823
|
-
new_obj =
|
825
|
+
new_obj = self.base_queryset_class(model=self.model).create(**kwargs)
|
824
826
|
self.add(new_obj, through_defaults=through_defaults)
|
825
827
|
return new_obj
|
826
828
|
|
827
829
|
def get_or_create(self, *, through_defaults=None, **kwargs):
|
828
|
-
obj, created =
|
830
|
+
obj, created = self.base_queryset_class(model=self.model).get_or_create(
|
831
|
+
**kwargs
|
832
|
+
)
|
829
833
|
# We only need to add() if created because if we got an object back
|
830
834
|
# from get() then the relationship already exists.
|
831
835
|
if created:
|
@@ -833,7 +837,9 @@ def create_forward_many_to_many_manager(superclass, rel, reverse):
|
|
833
837
|
return obj, created
|
834
838
|
|
835
839
|
def update_or_create(self, *, through_defaults=None, **kwargs):
|
836
|
-
obj, created =
|
840
|
+
obj, created = self.base_queryset_class(model=self.model).update_or_create(
|
841
|
+
**kwargs
|
842
|
+
)
|
837
843
|
# We only need to add() if created because if we got an object back
|
838
844
|
# from get() then the relationship already exists.
|
839
845
|
if created:
|
@@ -871,9 +877,7 @@ def create_forward_many_to_many_manager(superclass, rel, reverse):
|
|
871
877
|
Return the subset of ids of `objs` that aren't already assigned to
|
872
878
|
this relationship.
|
873
879
|
"""
|
874
|
-
vals = self.through.
|
875
|
-
target_field_name, flat=True
|
876
|
-
).filter(
|
880
|
+
vals = self.through.query.values_list(target_field_name, flat=True).filter(
|
877
881
|
**{
|
878
882
|
source_field_name: self.related_val[0],
|
879
883
|
f"{target_field_name}__in": target_ids,
|
@@ -899,7 +903,7 @@ def create_forward_many_to_many_manager(superclass, rel, reverse):
|
|
899
903
|
)
|
900
904
|
with transaction.atomic(savepoint=False):
|
901
905
|
# Add the ones that aren't there already.
|
902
|
-
self.through.
|
906
|
+
self.through.query.bulk_create(
|
903
907
|
[
|
904
908
|
self.through(
|
905
909
|
**through_defaults,
|
@@ -930,7 +934,7 @@ def create_forward_many_to_many_manager(superclass, rel, reverse):
|
|
930
934
|
old_ids.add(obj)
|
931
935
|
|
932
936
|
with transaction.atomic(savepoint=False):
|
933
|
-
target_model_qs =
|
937
|
+
target_model_qs = self.base_queryset_class(model=self.model)
|
934
938
|
if target_model_qs._has_filters():
|
935
939
|
old_vals = target_model_qs.filter(
|
936
940
|
**{f"{self.target_field.target_field.attname}__in": old_ids}
|
@@ -938,6 +942,6 @@ def create_forward_many_to_many_manager(superclass, rel, reverse):
|
|
938
942
|
else:
|
939
943
|
old_vals = old_ids
|
940
944
|
filters = self._build_remove_filters(old_vals)
|
941
|
-
self.through.
|
945
|
+
self.through.query.filter(filters).delete()
|
942
946
|
|
943
947
|
return ManyRelatedManager
|
@@ -53,7 +53,7 @@ def get_normalized_value(value, lhs):
|
|
53
53
|
try:
|
54
54
|
value_list.append(getattr(value, source.attname))
|
55
55
|
except AttributeError:
|
56
|
-
# A case like Restaurant.
|
56
|
+
# A case like Restaurant.query.filter(place=restaurant_instance),
|
57
57
|
# where place is a OneToOneField and the primary key of Restaurant.
|
58
58
|
return (value.id,)
|
59
59
|
return tuple(value_list)
|
@@ -88,7 +88,7 @@ class RelatedIn(In):
|
|
88
88
|
and self.lhs.output_field.model == self.rhs.model
|
89
89
|
):
|
90
90
|
# A case like
|
91
|
-
# Restaurant.
|
91
|
+
# Restaurant.query.filter(place__in=restaurant_qs), where
|
92
92
|
# place is a OneToOneField and the primary key of
|
93
93
|
# Restaurant.
|
94
94
|
target_field = self.lhs.field.name
|
@@ -166,7 +166,7 @@ class ForeignObjectRel(FieldCacheMixin):
|
|
166
166
|
initially for utilization by RelatedFieldListFilter.
|
167
167
|
"""
|
168
168
|
limit_choices_to = limit_choices_to or self.limit_choices_to
|
169
|
-
qs = self.related_model.
|
169
|
+
qs = self.related_model.query.complex_filter(limit_choices_to)
|
170
170
|
if ordering:
|
171
171
|
qs = qs.order_by(*ordering)
|
172
172
|
return (blank_choice if include_blank else []) + [(x.id, str(x)) for x in qs]
|
plain/models/forms.py
CHANGED
@@ -152,7 +152,6 @@ class MigrationAutodetector:
|
|
152
152
|
self.generate_deleted_models()
|
153
153
|
self.generate_created_models()
|
154
154
|
self.generate_altered_options()
|
155
|
-
self.generate_altered_managers()
|
156
155
|
self.generate_altered_db_table_comment()
|
157
156
|
|
158
157
|
# Create the renamed fields and store them in self.renamed_fields.
|
@@ -600,7 +599,6 @@ class MigrationAutodetector:
|
|
600
599
|
],
|
601
600
|
options=model_state.options,
|
602
601
|
bases=model_state.bases,
|
603
|
-
managers=model_state.managers,
|
604
602
|
),
|
605
603
|
dependencies=dependencies,
|
606
604
|
beginning=True,
|
@@ -1258,22 +1256,6 @@ class MigrationAutodetector:
|
|
1258
1256
|
),
|
1259
1257
|
)
|
1260
1258
|
|
1261
|
-
def generate_altered_managers(self):
|
1262
|
-
for package_label, model_name in sorted(self.kept_model_keys):
|
1263
|
-
old_model_name = self.renamed_models.get(
|
1264
|
-
(package_label, model_name), model_name
|
1265
|
-
)
|
1266
|
-
old_model_state = self.from_state.models[package_label, old_model_name]
|
1267
|
-
new_model_state = self.to_state.models[package_label, model_name]
|
1268
|
-
if old_model_state.managers != new_model_state.managers:
|
1269
|
-
self.add_operation(
|
1270
|
-
package_label,
|
1271
|
-
operations.AlterModelManagers(
|
1272
|
-
name=model_name,
|
1273
|
-
managers=new_model_state.managers,
|
1274
|
-
),
|
1275
|
-
)
|
1276
|
-
|
1277
1259
|
def arrange_for_graph(self, changes, graph, migration_name=None):
|
1278
1260
|
"""
|
1279
1261
|
Take a result from changes() and a MigrationGraph, and fix the names
|
@@ -2,7 +2,6 @@ from .fields import AddField, AlterField, RemoveField, RenameField
|
|
2
2
|
from .models import (
|
3
3
|
AddConstraint,
|
4
4
|
AddIndex,
|
5
|
-
AlterModelManagers,
|
6
5
|
AlterModelOptions,
|
7
6
|
AlterModelTable,
|
8
7
|
AlterModelTableComment,
|
@@ -34,5 +33,4 @@ __all__ = [
|
|
34
33
|
"SeparateDatabaseAndState",
|
35
34
|
"RunSQL",
|
36
35
|
"RunPython",
|
37
|
-
"AlterModelManagers",
|
38
36
|
]
|
@@ -41,16 +41,14 @@ class ModelOperation(Operation):
|
|
41
41
|
class CreateModel(ModelOperation):
|
42
42
|
"""Create a model's table."""
|
43
43
|
|
44
|
-
serialization_expand_args = ["fields", "options"
|
44
|
+
serialization_expand_args = ["fields", "options"]
|
45
45
|
|
46
|
-
def __init__(self, name, fields, options=None, bases=None
|
46
|
+
def __init__(self, name, fields, options=None, bases=None):
|
47
47
|
self.fields = fields
|
48
48
|
self.options = options or {}
|
49
49
|
self.bases = bases or (models.Model,)
|
50
|
-
self.managers = managers or []
|
51
50
|
super().__init__(name)
|
52
|
-
# Sanity-check that there are no duplicated field names
|
53
|
-
# manager names
|
51
|
+
# Sanity-check that there are no duplicated field names or bases
|
54
52
|
_check_for_duplicates("fields", (name for name, _ in self.fields))
|
55
53
|
_check_for_duplicates(
|
56
54
|
"bases",
|
@@ -63,7 +61,6 @@ class CreateModel(ModelOperation):
|
|
63
61
|
for base in self.bases
|
64
62
|
),
|
65
63
|
)
|
66
|
-
_check_for_duplicates("managers", (name for name, _ in self.managers))
|
67
64
|
|
68
65
|
def deconstruct(self):
|
69
66
|
kwargs = {
|
@@ -74,8 +71,6 @@ class CreateModel(ModelOperation):
|
|
74
71
|
kwargs["options"] = self.options
|
75
72
|
if self.bases and self.bases != (models.Model,):
|
76
73
|
kwargs["bases"] = self.bases
|
77
|
-
if self.managers and self.managers != [("objects", models.Manager())]:
|
78
|
-
kwargs["managers"] = self.managers
|
79
74
|
return (self.__class__.__qualname__, [], kwargs)
|
80
75
|
|
81
76
|
def state_forwards(self, package_label, state):
|
@@ -86,7 +81,6 @@ class CreateModel(ModelOperation):
|
|
86
81
|
list(self.fields),
|
87
82
|
dict(self.options),
|
88
83
|
tuple(self.bases),
|
89
|
-
list(self.managers),
|
90
84
|
)
|
91
85
|
)
|
92
86
|
|
@@ -141,7 +135,6 @@ class CreateModel(ModelOperation):
|
|
141
135
|
fields=self.fields,
|
142
136
|
options=self.options,
|
143
137
|
bases=self.bases,
|
144
|
-
managers=self.managers,
|
145
138
|
),
|
146
139
|
]
|
147
140
|
elif (
|
@@ -158,20 +151,6 @@ class CreateModel(ModelOperation):
|
|
158
151
|
fields=self.fields,
|
159
152
|
options=options,
|
160
153
|
bases=self.bases,
|
161
|
-
managers=self.managers,
|
162
|
-
),
|
163
|
-
]
|
164
|
-
elif (
|
165
|
-
isinstance(operation, AlterModelManagers)
|
166
|
-
and self.name_lower == operation.name_lower
|
167
|
-
):
|
168
|
-
return [
|
169
|
-
CreateModel(
|
170
|
-
self.name,
|
171
|
-
fields=self.fields,
|
172
|
-
options=self.options,
|
173
|
-
bases=self.bases,
|
174
|
-
managers=operation.managers,
|
175
154
|
),
|
176
155
|
]
|
177
156
|
elif (
|
@@ -185,7 +164,6 @@ class CreateModel(ModelOperation):
|
|
185
164
|
fields=self.fields + [(operation.name, operation.field)],
|
186
165
|
options=self.options,
|
187
166
|
bases=self.bases,
|
188
|
-
managers=self.managers,
|
189
167
|
),
|
190
168
|
]
|
191
169
|
elif isinstance(operation, AlterField):
|
@@ -198,7 +176,6 @@ class CreateModel(ModelOperation):
|
|
198
176
|
],
|
199
177
|
options=self.options,
|
200
178
|
bases=self.bases,
|
201
|
-
managers=self.managers,
|
202
179
|
),
|
203
180
|
]
|
204
181
|
elif isinstance(operation, RemoveField):
|
@@ -214,7 +191,6 @@ class CreateModel(ModelOperation):
|
|
214
191
|
],
|
215
192
|
options=options,
|
216
193
|
bases=self.bases,
|
217
|
-
managers=self.managers,
|
218
194
|
),
|
219
195
|
]
|
220
196
|
elif isinstance(operation, RenameField):
|
@@ -229,7 +205,6 @@ class CreateModel(ModelOperation):
|
|
229
205
|
],
|
230
206
|
options=options,
|
231
207
|
bases=self.bases,
|
232
|
-
managers=self.managers,
|
233
208
|
),
|
234
209
|
]
|
235
210
|
return super().reduce(operation, package_label)
|
@@ -447,9 +422,6 @@ class AlterModelOptions(ModelOptionOperation):
|
|
447
422
|
|
448
423
|
# Model options we want to compare and preserve in an AlterModelOptions op
|
449
424
|
ALTER_OPTION_KEYS = [
|
450
|
-
"base_manager_name",
|
451
|
-
"default_manager_name",
|
452
|
-
"default_related_name",
|
453
425
|
"ordering",
|
454
426
|
]
|
455
427
|
|
@@ -483,32 +455,6 @@ class AlterModelOptions(ModelOptionOperation):
|
|
483
455
|
return f"alter_{self.name_lower}_options"
|
484
456
|
|
485
457
|
|
486
|
-
class AlterModelManagers(ModelOptionOperation):
|
487
|
-
"""Alter the model's managers."""
|
488
|
-
|
489
|
-
serialization_expand_args = ["managers"]
|
490
|
-
|
491
|
-
def __init__(self, name, managers):
|
492
|
-
self.managers = managers
|
493
|
-
super().__init__(name)
|
494
|
-
|
495
|
-
def deconstruct(self):
|
496
|
-
return (self.__class__.__qualname__, [self.name, self.managers], {})
|
497
|
-
|
498
|
-
def state_forwards(self, package_label, state):
|
499
|
-
state.alter_model_managers(package_label, self.name_lower, self.managers)
|
500
|
-
|
501
|
-
def database_forwards(self, package_label, schema_editor, from_state, to_state):
|
502
|
-
pass
|
503
|
-
|
504
|
-
def describe(self):
|
505
|
-
return f"Change managers on {self.name}"
|
506
|
-
|
507
|
-
@property
|
508
|
-
def migration_name_fragment(self):
|
509
|
-
return f"alter_{self.name_lower}_managers"
|
510
|
-
|
511
|
-
|
512
458
|
class IndexOperation(Operation):
|
513
459
|
option_name = "indexes"
|
514
460
|
|
@@ -49,10 +49,9 @@ class RunSQL(Operation):
|
|
49
49
|
by this SQL change, in case it's custom column/table creation/deletion.
|
50
50
|
"""
|
51
51
|
|
52
|
-
def __init__(self, sql, *, state_operations=None,
|
52
|
+
def __init__(self, sql, *, state_operations=None, elidable=False):
|
53
53
|
self.sql = sql
|
54
54
|
self.state_operations = state_operations or []
|
55
|
-
self.hints = hints or {}
|
56
55
|
self.elidable = elidable
|
57
56
|
|
58
57
|
def deconstruct(self):
|
@@ -61,8 +60,6 @@ class RunSQL(Operation):
|
|
61
60
|
}
|
62
61
|
if self.state_operations:
|
63
62
|
kwargs["state_operations"] = self.state_operations
|
64
|
-
if self.hints:
|
65
|
-
kwargs["hints"] = self.hints
|
66
63
|
return (self.__class__.__qualname__, [], kwargs)
|
67
64
|
|
68
65
|
def state_forwards(self, package_label, state):
|
@@ -99,13 +96,12 @@ class RunPython(Operation):
|
|
99
96
|
|
100
97
|
reduces_to_sql = False
|
101
98
|
|
102
|
-
def __init__(self, code, *, atomic=None,
|
99
|
+
def __init__(self, code, *, atomic=None, elidable=False):
|
103
100
|
self.atomic = atomic
|
104
101
|
# Forwards code
|
105
102
|
if not callable(code):
|
106
103
|
raise ValueError("RunPython must be supplied with a callable")
|
107
104
|
self.code = code
|
108
|
-
self.hints = hints or {}
|
109
105
|
self.elidable = elidable
|
110
106
|
|
111
107
|
def deconstruct(self):
|
@@ -114,8 +110,6 @@ class RunPython(Operation):
|
|
114
110
|
}
|
115
111
|
if self.atomic is not None:
|
116
112
|
kwargs["atomic"] = self.atomic
|
117
|
-
if self.hints:
|
118
|
-
kwargs["hints"] = self.hints
|
119
113
|
return (self.__class__.__qualname__, [], kwargs)
|
120
114
|
|
121
115
|
def state_forwards(self, package_label, state):
|
@@ -215,16 +215,6 @@ class ModelFieldSerializer(DeconstructableSerializer):
|
|
215
215
|
return self.serialize_deconstructed(path, args, kwargs)
|
216
216
|
|
217
217
|
|
218
|
-
class ModelManagerSerializer(DeconstructableSerializer):
|
219
|
-
def serialize(self):
|
220
|
-
as_manager, manager_path, qs_path, args, kwargs = self.value.deconstruct()
|
221
|
-
if as_manager:
|
222
|
-
name, imports = self._serialize_path(qs_path)
|
223
|
-
return f"{name}.as_manager()", imports
|
224
|
-
else:
|
225
|
-
return self.serialize_deconstructed(manager_path, args, kwargs)
|
226
|
-
|
227
|
-
|
228
218
|
class OperationSerializer(BaseSerializer):
|
229
219
|
def serialize(self):
|
230
220
|
from plain.models.migrations.writer import OperationWriter
|
@@ -359,8 +349,6 @@ def serializer_factory(value):
|
|
359
349
|
|
360
350
|
if isinstance(value, models.Field):
|
361
351
|
return ModelFieldSerializer(value)
|
362
|
-
if isinstance(value, models.manager.BaseManager):
|
363
|
-
return ModelManagerSerializer(value)
|
364
352
|
if isinstance(value, Operation):
|
365
353
|
return OperationSerializer(value)
|
366
354
|
if isinstance(value, type):
|