plain.models 0.46.0__tar.gz → 0.47.0__tar.gz
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-0.46.0 → plain_models-0.47.0}/PKG-INFO +1 -1
- {plain_models-0.46.0 → plain_models-0.47.0}/plain/models/CHANGELOG.md +20 -0
- {plain_models-0.46.0 → plain_models-0.47.0}/plain/models/deletion.py +1 -1
- {plain_models-0.46.0 → plain_models-0.47.0}/plain/models/fields/related_managers.py +6 -4
- {plain_models-0.46.0 → plain_models-0.47.0}/plain/models/query.py +111 -98
- {plain_models-0.46.0 → plain_models-0.47.0}/pyproject.toml +1 -1
- {plain_models-0.46.0 → plain_models-0.47.0}/tests/test_related_descriptors.py +81 -2
- {plain_models-0.46.0 → plain_models-0.47.0}/.gitignore +0 -0
- {plain_models-0.46.0 → plain_models-0.47.0}/LICENSE +0 -0
- {plain_models-0.46.0 → plain_models-0.47.0}/README.md +0 -0
- {plain_models-0.46.0 → plain_models-0.47.0}/plain/models/AGENTS.md +0 -0
- {plain_models-0.46.0 → plain_models-0.47.0}/plain/models/README.md +0 -0
- {plain_models-0.46.0 → plain_models-0.47.0}/plain/models/__init__.py +0 -0
- {plain_models-0.46.0 → plain_models-0.47.0}/plain/models/aggregates.py +0 -0
- {plain_models-0.46.0 → plain_models-0.47.0}/plain/models/backends/__init__.py +0 -0
- {plain_models-0.46.0 → plain_models-0.47.0}/plain/models/backends/base/__init__.py +0 -0
- {plain_models-0.46.0 → plain_models-0.47.0}/plain/models/backends/base/base.py +0 -0
- {plain_models-0.46.0 → plain_models-0.47.0}/plain/models/backends/base/client.py +0 -0
- {plain_models-0.46.0 → plain_models-0.47.0}/plain/models/backends/base/creation.py +0 -0
- {plain_models-0.46.0 → plain_models-0.47.0}/plain/models/backends/base/features.py +0 -0
- {plain_models-0.46.0 → plain_models-0.47.0}/plain/models/backends/base/introspection.py +0 -0
- {plain_models-0.46.0 → plain_models-0.47.0}/plain/models/backends/base/operations.py +0 -0
- {plain_models-0.46.0 → plain_models-0.47.0}/plain/models/backends/base/schema.py +0 -0
- {plain_models-0.46.0 → plain_models-0.47.0}/plain/models/backends/base/validation.py +0 -0
- {plain_models-0.46.0 → plain_models-0.47.0}/plain/models/backends/ddl_references.py +0 -0
- {plain_models-0.46.0 → plain_models-0.47.0}/plain/models/backends/mysql/__init__.py +0 -0
- {plain_models-0.46.0 → plain_models-0.47.0}/plain/models/backends/mysql/base.py +0 -0
- {plain_models-0.46.0 → plain_models-0.47.0}/plain/models/backends/mysql/client.py +0 -0
- {plain_models-0.46.0 → plain_models-0.47.0}/plain/models/backends/mysql/compiler.py +0 -0
- {plain_models-0.46.0 → plain_models-0.47.0}/plain/models/backends/mysql/creation.py +0 -0
- {plain_models-0.46.0 → plain_models-0.47.0}/plain/models/backends/mysql/features.py +0 -0
- {plain_models-0.46.0 → plain_models-0.47.0}/plain/models/backends/mysql/introspection.py +0 -0
- {plain_models-0.46.0 → plain_models-0.47.0}/plain/models/backends/mysql/operations.py +0 -0
- {plain_models-0.46.0 → plain_models-0.47.0}/plain/models/backends/mysql/schema.py +0 -0
- {plain_models-0.46.0 → plain_models-0.47.0}/plain/models/backends/mysql/validation.py +0 -0
- {plain_models-0.46.0 → plain_models-0.47.0}/plain/models/backends/postgresql/__init__.py +0 -0
- {plain_models-0.46.0 → plain_models-0.47.0}/plain/models/backends/postgresql/base.py +0 -0
- {plain_models-0.46.0 → plain_models-0.47.0}/plain/models/backends/postgresql/client.py +0 -0
- {plain_models-0.46.0 → plain_models-0.47.0}/plain/models/backends/postgresql/creation.py +0 -0
- {plain_models-0.46.0 → plain_models-0.47.0}/plain/models/backends/postgresql/features.py +0 -0
- {plain_models-0.46.0 → plain_models-0.47.0}/plain/models/backends/postgresql/introspection.py +0 -0
- {plain_models-0.46.0 → plain_models-0.47.0}/plain/models/backends/postgresql/operations.py +0 -0
- {plain_models-0.46.0 → plain_models-0.47.0}/plain/models/backends/postgresql/schema.py +0 -0
- {plain_models-0.46.0 → plain_models-0.47.0}/plain/models/backends/sqlite3/__init__.py +0 -0
- {plain_models-0.46.0 → plain_models-0.47.0}/plain/models/backends/sqlite3/_functions.py +0 -0
- {plain_models-0.46.0 → plain_models-0.47.0}/plain/models/backends/sqlite3/base.py +0 -0
- {plain_models-0.46.0 → plain_models-0.47.0}/plain/models/backends/sqlite3/client.py +0 -0
- {plain_models-0.46.0 → plain_models-0.47.0}/plain/models/backends/sqlite3/creation.py +0 -0
- {plain_models-0.46.0 → plain_models-0.47.0}/plain/models/backends/sqlite3/features.py +0 -0
- {plain_models-0.46.0 → plain_models-0.47.0}/plain/models/backends/sqlite3/introspection.py +0 -0
- {plain_models-0.46.0 → plain_models-0.47.0}/plain/models/backends/sqlite3/operations.py +0 -0
- {plain_models-0.46.0 → plain_models-0.47.0}/plain/models/backends/sqlite3/schema.py +0 -0
- {plain_models-0.46.0 → plain_models-0.47.0}/plain/models/backends/utils.py +0 -0
- {plain_models-0.46.0 → plain_models-0.47.0}/plain/models/backups/__init__.py +0 -0
- {plain_models-0.46.0 → plain_models-0.47.0}/plain/models/backups/cli.py +0 -0
- {plain_models-0.46.0 → plain_models-0.47.0}/plain/models/backups/clients.py +0 -0
- {plain_models-0.46.0 → plain_models-0.47.0}/plain/models/backups/core.py +0 -0
- {plain_models-0.46.0 → plain_models-0.47.0}/plain/models/base.py +0 -0
- {plain_models-0.46.0 → plain_models-0.47.0}/plain/models/cli.py +0 -0
- {plain_models-0.46.0 → plain_models-0.47.0}/plain/models/config.py +0 -0
- {plain_models-0.46.0 → plain_models-0.47.0}/plain/models/connections.py +0 -0
- {plain_models-0.46.0 → plain_models-0.47.0}/plain/models/constants.py +0 -0
- {plain_models-0.46.0 → plain_models-0.47.0}/plain/models/constraints.py +0 -0
- {plain_models-0.46.0 → plain_models-0.47.0}/plain/models/database_url.py +0 -0
- {plain_models-0.46.0 → plain_models-0.47.0}/plain/models/db.py +0 -0
- {plain_models-0.46.0 → plain_models-0.47.0}/plain/models/default_settings.py +0 -0
- {plain_models-0.46.0 → plain_models-0.47.0}/plain/models/entrypoints.py +0 -0
- {plain_models-0.46.0 → plain_models-0.47.0}/plain/models/enums.py +0 -0
- {plain_models-0.46.0 → plain_models-0.47.0}/plain/models/exceptions.py +0 -0
- {plain_models-0.46.0 → plain_models-0.47.0}/plain/models/expressions.py +0 -0
- {plain_models-0.46.0 → plain_models-0.47.0}/plain/models/fields/__init__.py +0 -0
- {plain_models-0.46.0 → plain_models-0.47.0}/plain/models/fields/json.py +0 -0
- {plain_models-0.46.0 → plain_models-0.47.0}/plain/models/fields/mixins.py +0 -0
- {plain_models-0.46.0 → plain_models-0.47.0}/plain/models/fields/related.py +0 -0
- {plain_models-0.46.0 → plain_models-0.47.0}/plain/models/fields/related_descriptors.py +0 -0
- {plain_models-0.46.0 → plain_models-0.47.0}/plain/models/fields/related_lookups.py +0 -0
- {plain_models-0.46.0 → plain_models-0.47.0}/plain/models/fields/reverse_related.py +0 -0
- {plain_models-0.46.0 → plain_models-0.47.0}/plain/models/forms.py +0 -0
- {plain_models-0.46.0 → plain_models-0.47.0}/plain/models/functions/__init__.py +0 -0
- {plain_models-0.46.0 → plain_models-0.47.0}/plain/models/functions/comparison.py +0 -0
- {plain_models-0.46.0 → plain_models-0.47.0}/plain/models/functions/datetime.py +0 -0
- {plain_models-0.46.0 → plain_models-0.47.0}/plain/models/functions/math.py +0 -0
- {plain_models-0.46.0 → plain_models-0.47.0}/plain/models/functions/mixins.py +0 -0
- {plain_models-0.46.0 → plain_models-0.47.0}/plain/models/functions/text.py +0 -0
- {plain_models-0.46.0 → plain_models-0.47.0}/plain/models/functions/window.py +0 -0
- {plain_models-0.46.0 → plain_models-0.47.0}/plain/models/indexes.py +0 -0
- {plain_models-0.46.0 → plain_models-0.47.0}/plain/models/lookups.py +0 -0
- {plain_models-0.46.0 → plain_models-0.47.0}/plain/models/migrations/__init__.py +0 -0
- {plain_models-0.46.0 → plain_models-0.47.0}/plain/models/migrations/autodetector.py +0 -0
- {plain_models-0.46.0 → plain_models-0.47.0}/plain/models/migrations/exceptions.py +0 -0
- {plain_models-0.46.0 → plain_models-0.47.0}/plain/models/migrations/executor.py +0 -0
- {plain_models-0.46.0 → plain_models-0.47.0}/plain/models/migrations/graph.py +0 -0
- {plain_models-0.46.0 → plain_models-0.47.0}/plain/models/migrations/loader.py +0 -0
- {plain_models-0.46.0 → plain_models-0.47.0}/plain/models/migrations/migration.py +0 -0
- {plain_models-0.46.0 → plain_models-0.47.0}/plain/models/migrations/operations/__init__.py +0 -0
- {plain_models-0.46.0 → plain_models-0.47.0}/plain/models/migrations/operations/base.py +0 -0
- {plain_models-0.46.0 → plain_models-0.47.0}/plain/models/migrations/operations/fields.py +0 -0
- {plain_models-0.46.0 → plain_models-0.47.0}/plain/models/migrations/operations/models.py +0 -0
- {plain_models-0.46.0 → plain_models-0.47.0}/plain/models/migrations/operations/special.py +0 -0
- {plain_models-0.46.0 → plain_models-0.47.0}/plain/models/migrations/optimizer.py +0 -0
- {plain_models-0.46.0 → plain_models-0.47.0}/plain/models/migrations/questioner.py +0 -0
- {plain_models-0.46.0 → plain_models-0.47.0}/plain/models/migrations/recorder.py +0 -0
- {plain_models-0.46.0 → plain_models-0.47.0}/plain/models/migrations/serializer.py +0 -0
- {plain_models-0.46.0 → plain_models-0.47.0}/plain/models/migrations/state.py +0 -0
- {plain_models-0.46.0 → plain_models-0.47.0}/plain/models/migrations/utils.py +0 -0
- {plain_models-0.46.0 → plain_models-0.47.0}/plain/models/migrations/writer.py +0 -0
- {plain_models-0.46.0 → plain_models-0.47.0}/plain/models/options.py +0 -0
- {plain_models-0.46.0 → plain_models-0.47.0}/plain/models/otel.py +0 -0
- {plain_models-0.46.0 → plain_models-0.47.0}/plain/models/preflight.py +0 -0
- {plain_models-0.46.0 → plain_models-0.47.0}/plain/models/query_utils.py +0 -0
- {plain_models-0.46.0 → plain_models-0.47.0}/plain/models/registry.py +0 -0
- {plain_models-0.46.0 → plain_models-0.47.0}/plain/models/sql/__init__.py +0 -0
- {plain_models-0.46.0 → plain_models-0.47.0}/plain/models/sql/compiler.py +0 -0
- {plain_models-0.46.0 → plain_models-0.47.0}/plain/models/sql/constants.py +0 -0
- {plain_models-0.46.0 → plain_models-0.47.0}/plain/models/sql/datastructures.py +0 -0
- {plain_models-0.46.0 → plain_models-0.47.0}/plain/models/sql/query.py +0 -0
- {plain_models-0.46.0 → plain_models-0.47.0}/plain/models/sql/subqueries.py +0 -0
- {plain_models-0.46.0 → plain_models-0.47.0}/plain/models/sql/where.py +0 -0
- {plain_models-0.46.0 → plain_models-0.47.0}/plain/models/test/__init__.py +0 -0
- {plain_models-0.46.0 → plain_models-0.47.0}/plain/models/test/pytest.py +0 -0
- {plain_models-0.46.0 → plain_models-0.47.0}/plain/models/test/utils.py +0 -0
- {plain_models-0.46.0 → plain_models-0.47.0}/plain/models/transaction.py +0 -0
- {plain_models-0.46.0 → plain_models-0.47.0}/plain/models/utils.py +0 -0
- {plain_models-0.46.0 → plain_models-0.47.0}/tests/app/examples/migrations/0001_initial.py +0 -0
- {plain_models-0.46.0 → plain_models-0.47.0}/tests/app/examples/migrations/0002_test_field_removed.py +0 -0
- {plain_models-0.46.0 → plain_models-0.47.0}/tests/app/examples/migrations/0003_deleteparent_childsetnull_childsetdefault_and_more.py +0 -0
- {plain_models-0.46.0 → plain_models-0.47.0}/tests/app/examples/migrations/__init__.py +0 -0
- {plain_models-0.46.0 → plain_models-0.47.0}/tests/app/examples/models.py +0 -0
- {plain_models-0.46.0 → plain_models-0.47.0}/tests/app/settings.py +0 -0
- {plain_models-0.46.0 → plain_models-0.47.0}/tests/app/urls.py +0 -0
- {plain_models-0.46.0 → plain_models-0.47.0}/tests/test_database_url.py +0 -0
- {plain_models-0.46.0 → plain_models-0.47.0}/tests/test_delete_behaviors.py +0 -0
- {plain_models-0.46.0 → plain_models-0.47.0}/tests/test_exceptions.py +0 -0
- {plain_models-0.46.0 → plain_models-0.47.0}/tests/test_manager_assignment.py +0 -0
- {plain_models-0.46.0 → plain_models-0.47.0}/tests/test_models.py +0 -0
- {plain_models-0.46.0 → plain_models-0.47.0}/tests/test_related_manager_api.py +0 -0
@@ -1,5 +1,25 @@
|
|
1
1
|
# plain-models changelog
|
2
2
|
|
3
|
+
## [0.47.0](https://github.com/dropseed/plain/releases/plain-models@0.47.0) (2025-09-25)
|
4
|
+
|
5
|
+
### What's changed
|
6
|
+
|
7
|
+
- The `QuerySet.query` property has been renamed to `QuerySet.sql_query` to better distinguish it from the `Model.query` manager interface ([d250eea](https://github.com/dropseed/plain/commit/d250eeac03))
|
8
|
+
|
9
|
+
### Upgrade instructions
|
10
|
+
|
11
|
+
- If you directly accessed the `QuerySet.query` property in your code (typically for advanced query manipulation or debugging), rename it to `QuerySet.sql_query`
|
12
|
+
|
13
|
+
## [0.46.1](https://github.com/dropseed/plain/releases/plain-models@0.46.1) (2025-09-25)
|
14
|
+
|
15
|
+
### What's changed
|
16
|
+
|
17
|
+
- Fixed `prefetch_related` for reverse foreign key relationships by correctly handling related managers in the prefetch query process ([2c04e80](https://github.com/dropseed/plain/commit/2c04e80dcd))
|
18
|
+
|
19
|
+
### Upgrade instructions
|
20
|
+
|
21
|
+
- No changes required
|
22
|
+
|
3
23
|
## [0.46.0](https://github.com/dropseed/plain/releases/plain-models@0.46.0) (2025-09-25)
|
4
24
|
|
5
25
|
### What's changed
|
@@ -288,7 +288,7 @@ class Collector:
|
|
288
288
|
# relationships are select_related as interactions between both
|
289
289
|
# features are hard to get right. This should only happen in
|
290
290
|
# the rare cases where .related_objects is overridden anyway.
|
291
|
-
if not sub_objs.
|
291
|
+
if not sub_objs.sql_query.select_related:
|
292
292
|
referenced_fields = set(
|
293
293
|
chain.from_iterable(
|
294
294
|
(rf.attname for rf in rel.field.foreign_related_fields)
|
@@ -17,19 +17,21 @@ from plain.models.utils import resolve_callables
|
|
17
17
|
|
18
18
|
def _filter_prefetch_queryset(queryset, field_name, instances):
|
19
19
|
predicate = Q(**{f"{field_name}__in": instances})
|
20
|
-
if queryset.
|
20
|
+
if queryset.sql_query.is_sliced:
|
21
21
|
if not db_connection.features.supports_over_clause:
|
22
22
|
raise NotSupportedError(
|
23
23
|
"Prefetching from a limited queryset is only supported on backends "
|
24
24
|
"that support window functions."
|
25
25
|
)
|
26
|
-
low_mark, high_mark = queryset.
|
27
|
-
order_by = [
|
26
|
+
low_mark, high_mark = queryset.sql_query.low_mark, queryset.sql_query.high_mark
|
27
|
+
order_by = [
|
28
|
+
expr for expr, _ in queryset.sql_query.get_compiler().get_order_by()
|
29
|
+
]
|
28
30
|
window = Window(RowNumber(), partition_by=field_name, order_by=order_by)
|
29
31
|
predicate &= GreaterThan(window, low_mark)
|
30
32
|
if high_mark is not None:
|
31
33
|
predicate &= LessThanOrEqual(window, high_mark)
|
32
|
-
queryset.
|
34
|
+
queryset.sql_query.clear_limits()
|
33
35
|
return queryset.filter(predicate)
|
34
36
|
|
35
37
|
|