plain.models 0.51.0__tar.gz → 0.51.1__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.
Files changed (138) hide show
  1. {plain_models-0.51.0 → plain_models-0.51.1}/PKG-INFO +1 -1
  2. {plain_models-0.51.0 → plain_models-0.51.1}/plain/models/CHANGELOG.md +10 -0
  3. {plain_models-0.51.0 → plain_models-0.51.1}/plain/models/expressions.py +20 -4
  4. {plain_models-0.51.0 → plain_models-0.51.1}/pyproject.toml +1 -1
  5. {plain_models-0.51.0 → plain_models-0.51.1}/.gitignore +0 -0
  6. {plain_models-0.51.0 → plain_models-0.51.1}/LICENSE +0 -0
  7. {plain_models-0.51.0 → plain_models-0.51.1}/README.md +0 -0
  8. {plain_models-0.51.0 → plain_models-0.51.1}/plain/models/AGENTS.md +0 -0
  9. {plain_models-0.51.0 → plain_models-0.51.1}/plain/models/README.md +0 -0
  10. {plain_models-0.51.0 → plain_models-0.51.1}/plain/models/__init__.py +0 -0
  11. {plain_models-0.51.0 → plain_models-0.51.1}/plain/models/aggregates.py +0 -0
  12. {plain_models-0.51.0 → plain_models-0.51.1}/plain/models/backends/__init__.py +0 -0
  13. {plain_models-0.51.0 → plain_models-0.51.1}/plain/models/backends/base/__init__.py +0 -0
  14. {plain_models-0.51.0 → plain_models-0.51.1}/plain/models/backends/base/base.py +0 -0
  15. {plain_models-0.51.0 → plain_models-0.51.1}/plain/models/backends/base/client.py +0 -0
  16. {plain_models-0.51.0 → plain_models-0.51.1}/plain/models/backends/base/creation.py +0 -0
  17. {plain_models-0.51.0 → plain_models-0.51.1}/plain/models/backends/base/features.py +0 -0
  18. {plain_models-0.51.0 → plain_models-0.51.1}/plain/models/backends/base/introspection.py +0 -0
  19. {plain_models-0.51.0 → plain_models-0.51.1}/plain/models/backends/base/operations.py +0 -0
  20. {plain_models-0.51.0 → plain_models-0.51.1}/plain/models/backends/base/schema.py +0 -0
  21. {plain_models-0.51.0 → plain_models-0.51.1}/plain/models/backends/base/validation.py +0 -0
  22. {plain_models-0.51.0 → plain_models-0.51.1}/plain/models/backends/ddl_references.py +0 -0
  23. {plain_models-0.51.0 → plain_models-0.51.1}/plain/models/backends/mysql/__init__.py +0 -0
  24. {plain_models-0.51.0 → plain_models-0.51.1}/plain/models/backends/mysql/base.py +0 -0
  25. {plain_models-0.51.0 → plain_models-0.51.1}/plain/models/backends/mysql/client.py +0 -0
  26. {plain_models-0.51.0 → plain_models-0.51.1}/plain/models/backends/mysql/compiler.py +0 -0
  27. {plain_models-0.51.0 → plain_models-0.51.1}/plain/models/backends/mysql/creation.py +0 -0
  28. {plain_models-0.51.0 → plain_models-0.51.1}/plain/models/backends/mysql/features.py +0 -0
  29. {plain_models-0.51.0 → plain_models-0.51.1}/plain/models/backends/mysql/introspection.py +0 -0
  30. {plain_models-0.51.0 → plain_models-0.51.1}/plain/models/backends/mysql/operations.py +0 -0
  31. {plain_models-0.51.0 → plain_models-0.51.1}/plain/models/backends/mysql/schema.py +0 -0
  32. {plain_models-0.51.0 → plain_models-0.51.1}/plain/models/backends/mysql/validation.py +0 -0
  33. {plain_models-0.51.0 → plain_models-0.51.1}/plain/models/backends/postgresql/__init__.py +0 -0
  34. {plain_models-0.51.0 → plain_models-0.51.1}/plain/models/backends/postgresql/base.py +0 -0
  35. {plain_models-0.51.0 → plain_models-0.51.1}/plain/models/backends/postgresql/client.py +0 -0
  36. {plain_models-0.51.0 → plain_models-0.51.1}/plain/models/backends/postgresql/creation.py +0 -0
  37. {plain_models-0.51.0 → plain_models-0.51.1}/plain/models/backends/postgresql/features.py +0 -0
  38. {plain_models-0.51.0 → plain_models-0.51.1}/plain/models/backends/postgresql/introspection.py +0 -0
  39. {plain_models-0.51.0 → plain_models-0.51.1}/plain/models/backends/postgresql/operations.py +0 -0
  40. {plain_models-0.51.0 → plain_models-0.51.1}/plain/models/backends/postgresql/schema.py +0 -0
  41. {plain_models-0.51.0 → plain_models-0.51.1}/plain/models/backends/sqlite3/__init__.py +0 -0
  42. {plain_models-0.51.0 → plain_models-0.51.1}/plain/models/backends/sqlite3/_functions.py +0 -0
  43. {plain_models-0.51.0 → plain_models-0.51.1}/plain/models/backends/sqlite3/base.py +0 -0
  44. {plain_models-0.51.0 → plain_models-0.51.1}/plain/models/backends/sqlite3/client.py +0 -0
  45. {plain_models-0.51.0 → plain_models-0.51.1}/plain/models/backends/sqlite3/creation.py +0 -0
  46. {plain_models-0.51.0 → plain_models-0.51.1}/plain/models/backends/sqlite3/features.py +0 -0
  47. {plain_models-0.51.0 → plain_models-0.51.1}/plain/models/backends/sqlite3/introspection.py +0 -0
  48. {plain_models-0.51.0 → plain_models-0.51.1}/plain/models/backends/sqlite3/operations.py +0 -0
  49. {plain_models-0.51.0 → plain_models-0.51.1}/plain/models/backends/sqlite3/schema.py +0 -0
  50. {plain_models-0.51.0 → plain_models-0.51.1}/plain/models/backends/utils.py +0 -0
  51. {plain_models-0.51.0 → plain_models-0.51.1}/plain/models/backups/__init__.py +0 -0
  52. {plain_models-0.51.0 → plain_models-0.51.1}/plain/models/backups/cli.py +0 -0
  53. {plain_models-0.51.0 → plain_models-0.51.1}/plain/models/backups/clients.py +0 -0
  54. {plain_models-0.51.0 → plain_models-0.51.1}/plain/models/backups/core.py +0 -0
  55. {plain_models-0.51.0 → plain_models-0.51.1}/plain/models/base.py +0 -0
  56. {plain_models-0.51.0 → plain_models-0.51.1}/plain/models/cli.py +0 -0
  57. {plain_models-0.51.0 → plain_models-0.51.1}/plain/models/config.py +0 -0
  58. {plain_models-0.51.0 → plain_models-0.51.1}/plain/models/connections.py +0 -0
  59. {plain_models-0.51.0 → plain_models-0.51.1}/plain/models/constants.py +0 -0
  60. {plain_models-0.51.0 → plain_models-0.51.1}/plain/models/constraints.py +0 -0
  61. {plain_models-0.51.0 → plain_models-0.51.1}/plain/models/database_url.py +0 -0
  62. {plain_models-0.51.0 → plain_models-0.51.1}/plain/models/db.py +0 -0
  63. {plain_models-0.51.0 → plain_models-0.51.1}/plain/models/default_settings.py +0 -0
  64. {plain_models-0.51.0 → plain_models-0.51.1}/plain/models/deletion.py +0 -0
  65. {plain_models-0.51.0 → plain_models-0.51.1}/plain/models/entrypoints.py +0 -0
  66. {plain_models-0.51.0 → plain_models-0.51.1}/plain/models/enums.py +0 -0
  67. {plain_models-0.51.0 → plain_models-0.51.1}/plain/models/exceptions.py +0 -0
  68. {plain_models-0.51.0 → plain_models-0.51.1}/plain/models/fields/__init__.py +0 -0
  69. {plain_models-0.51.0 → plain_models-0.51.1}/plain/models/fields/json.py +0 -0
  70. {plain_models-0.51.0 → plain_models-0.51.1}/plain/models/fields/mixins.py +0 -0
  71. {plain_models-0.51.0 → plain_models-0.51.1}/plain/models/fields/related.py +0 -0
  72. {plain_models-0.51.0 → plain_models-0.51.1}/plain/models/fields/related_descriptors.py +0 -0
  73. {plain_models-0.51.0 → plain_models-0.51.1}/plain/models/fields/related_lookups.py +0 -0
  74. {plain_models-0.51.0 → plain_models-0.51.1}/plain/models/fields/related_managers.py +0 -0
  75. {plain_models-0.51.0 → plain_models-0.51.1}/plain/models/fields/reverse_related.py +0 -0
  76. {plain_models-0.51.0 → plain_models-0.51.1}/plain/models/forms.py +0 -0
  77. {plain_models-0.51.0 → plain_models-0.51.1}/plain/models/functions/__init__.py +0 -0
  78. {plain_models-0.51.0 → plain_models-0.51.1}/plain/models/functions/comparison.py +0 -0
  79. {plain_models-0.51.0 → plain_models-0.51.1}/plain/models/functions/datetime.py +0 -0
  80. {plain_models-0.51.0 → plain_models-0.51.1}/plain/models/functions/math.py +0 -0
  81. {plain_models-0.51.0 → plain_models-0.51.1}/plain/models/functions/mixins.py +0 -0
  82. {plain_models-0.51.0 → plain_models-0.51.1}/plain/models/functions/text.py +0 -0
  83. {plain_models-0.51.0 → plain_models-0.51.1}/plain/models/functions/window.py +0 -0
  84. {plain_models-0.51.0 → plain_models-0.51.1}/plain/models/indexes.py +0 -0
  85. {plain_models-0.51.0 → plain_models-0.51.1}/plain/models/lookups.py +0 -0
  86. {plain_models-0.51.0 → plain_models-0.51.1}/plain/models/meta.py +0 -0
  87. {plain_models-0.51.0 → plain_models-0.51.1}/plain/models/migrations/__init__.py +0 -0
  88. {plain_models-0.51.0 → plain_models-0.51.1}/plain/models/migrations/autodetector.py +0 -0
  89. {plain_models-0.51.0 → plain_models-0.51.1}/plain/models/migrations/exceptions.py +0 -0
  90. {plain_models-0.51.0 → plain_models-0.51.1}/plain/models/migrations/executor.py +0 -0
  91. {plain_models-0.51.0 → plain_models-0.51.1}/plain/models/migrations/graph.py +0 -0
  92. {plain_models-0.51.0 → plain_models-0.51.1}/plain/models/migrations/loader.py +0 -0
  93. {plain_models-0.51.0 → plain_models-0.51.1}/plain/models/migrations/migration.py +0 -0
  94. {plain_models-0.51.0 → plain_models-0.51.1}/plain/models/migrations/operations/__init__.py +0 -0
  95. {plain_models-0.51.0 → plain_models-0.51.1}/plain/models/migrations/operations/base.py +0 -0
  96. {plain_models-0.51.0 → plain_models-0.51.1}/plain/models/migrations/operations/fields.py +0 -0
  97. {plain_models-0.51.0 → plain_models-0.51.1}/plain/models/migrations/operations/models.py +0 -0
  98. {plain_models-0.51.0 → plain_models-0.51.1}/plain/models/migrations/operations/special.py +0 -0
  99. {plain_models-0.51.0 → plain_models-0.51.1}/plain/models/migrations/optimizer.py +0 -0
  100. {plain_models-0.51.0 → plain_models-0.51.1}/plain/models/migrations/questioner.py +0 -0
  101. {plain_models-0.51.0 → plain_models-0.51.1}/plain/models/migrations/recorder.py +0 -0
  102. {plain_models-0.51.0 → plain_models-0.51.1}/plain/models/migrations/serializer.py +0 -0
  103. {plain_models-0.51.0 → plain_models-0.51.1}/plain/models/migrations/state.py +0 -0
  104. {plain_models-0.51.0 → plain_models-0.51.1}/plain/models/migrations/utils.py +0 -0
  105. {plain_models-0.51.0 → plain_models-0.51.1}/plain/models/migrations/writer.py +0 -0
  106. {plain_models-0.51.0 → plain_models-0.51.1}/plain/models/options.py +0 -0
  107. {plain_models-0.51.0 → plain_models-0.51.1}/plain/models/otel.py +0 -0
  108. {plain_models-0.51.0 → plain_models-0.51.1}/plain/models/preflight.py +0 -0
  109. {plain_models-0.51.0 → plain_models-0.51.1}/plain/models/query.py +0 -0
  110. {plain_models-0.51.0 → plain_models-0.51.1}/plain/models/query_utils.py +0 -0
  111. {plain_models-0.51.0 → plain_models-0.51.1}/plain/models/registry.py +0 -0
  112. {plain_models-0.51.0 → plain_models-0.51.1}/plain/models/sql/__init__.py +0 -0
  113. {plain_models-0.51.0 → plain_models-0.51.1}/plain/models/sql/compiler.py +0 -0
  114. {plain_models-0.51.0 → plain_models-0.51.1}/plain/models/sql/constants.py +0 -0
  115. {plain_models-0.51.0 → plain_models-0.51.1}/plain/models/sql/datastructures.py +0 -0
  116. {plain_models-0.51.0 → plain_models-0.51.1}/plain/models/sql/query.py +0 -0
  117. {plain_models-0.51.0 → plain_models-0.51.1}/plain/models/sql/subqueries.py +0 -0
  118. {plain_models-0.51.0 → plain_models-0.51.1}/plain/models/sql/where.py +0 -0
  119. {plain_models-0.51.0 → plain_models-0.51.1}/plain/models/test/__init__.py +0 -0
  120. {plain_models-0.51.0 → plain_models-0.51.1}/plain/models/test/pytest.py +0 -0
  121. {plain_models-0.51.0 → plain_models-0.51.1}/plain/models/test/utils.py +0 -0
  122. {plain_models-0.51.0 → plain_models-0.51.1}/plain/models/transaction.py +0 -0
  123. {plain_models-0.51.0 → plain_models-0.51.1}/plain/models/utils.py +0 -0
  124. {plain_models-0.51.0 → plain_models-0.51.1}/tests/app/examples/migrations/0001_initial.py +0 -0
  125. {plain_models-0.51.0 → plain_models-0.51.1}/tests/app/examples/migrations/0002_test_field_removed.py +0 -0
  126. {plain_models-0.51.0 → plain_models-0.51.1}/tests/app/examples/migrations/0003_deleteparent_childsetnull_childsetdefault_and_more.py +0 -0
  127. {plain_models-0.51.0 → plain_models-0.51.1}/tests/app/examples/migrations/0004_defaultquerysetmodel_mixintestmodel_and_more.py +0 -0
  128. {plain_models-0.51.0 → plain_models-0.51.1}/tests/app/examples/migrations/__init__.py +0 -0
  129. {plain_models-0.51.0 → plain_models-0.51.1}/tests/app/examples/models.py +0 -0
  130. {plain_models-0.51.0 → plain_models-0.51.1}/tests/app/settings.py +0 -0
  131. {plain_models-0.51.0 → plain_models-0.51.1}/tests/app/urls.py +0 -0
  132. {plain_models-0.51.0 → plain_models-0.51.1}/tests/test_database_url.py +0 -0
  133. {plain_models-0.51.0 → plain_models-0.51.1}/tests/test_delete_behaviors.py +0 -0
  134. {plain_models-0.51.0 → plain_models-0.51.1}/tests/test_exceptions.py +0 -0
  135. {plain_models-0.51.0 → plain_models-0.51.1}/tests/test_manager_assignment.py +0 -0
  136. {plain_models-0.51.0 → plain_models-0.51.1}/tests/test_models.py +0 -0
  137. {plain_models-0.51.0 → plain_models-0.51.1}/tests/test_related_descriptors.py +0 -0
  138. {plain_models-0.51.0 → plain_models-0.51.1}/tests/test_related_manager_api.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: plain.models
3
- Version: 0.51.0
3
+ Version: 0.51.1
4
4
  Summary: Model your data and store it in a database.
5
5
  Author-email: Dave Gaeddert <dave.gaeddert@dropseed.dev>
6
6
  License-File: LICENSE
@@ -1,5 +1,15 @@
1
1
  # plain-models changelog
2
2
 
3
+ ## [0.51.1](https://github.com/dropseed/plain/releases/plain-models@0.51.1) (2025-10-08)
4
+
5
+ ### What's changed
6
+
7
+ - Fixed a bug in `Subquery` and `Exists` expressions that was using the old `query` attribute name instead of `sql_query` when extracting the SQL query from a QuerySet ([79ca52d](https://github.com/dropseed/plain/commit/79ca52d32e))
8
+
9
+ ### Upgrade instructions
10
+
11
+ - No changes required
12
+
3
13
  ## [0.51.0](https://github.com/dropseed/plain/releases/plain-models@0.51.0) (2025-10-07)
4
14
 
5
15
  ### What's changed
@@ -28,7 +28,9 @@ if TYPE_CHECKING:
28
28
 
29
29
  from plain.models.backends.base.base import BaseDatabaseWrapper
30
30
  from plain.models.fields import Field
31
+ from plain.models.query import QuerySet
31
32
  from plain.models.sql.compiler import SQLCompiler
33
+ from plain.models.sql.query import Query
32
34
 
33
35
 
34
36
  class SQLiteNumericMixin:
@@ -1635,9 +1637,23 @@ class Subquery(BaseExpression, Combinable):
1635
1637
  contains_aggregate = False
1636
1638
  empty_result_set_value = None
1637
1639
 
1638
- def __init__(self, queryset: Any, output_field: Field | None = None, **extra: Any):
1640
+ def __init__(
1641
+ self,
1642
+ query: QuerySet[Any] | Query,
1643
+ output_field: Field | None = None,
1644
+ **extra: Any,
1645
+ ):
1646
+ # Import here to avoid circular import
1647
+ from plain.models.sql.query import Query
1648
+
1639
1649
  # Allow the usage of both QuerySet and sql.Query objects.
1640
- self.query = getattr(queryset, "query", queryset).clone()
1650
+ if isinstance(query, Query):
1651
+ # It's already a Query object, use it directly
1652
+ sql_query = query
1653
+ else:
1654
+ # It's a QuerySet, extract the sql.Query
1655
+ sql_query = query.sql_query
1656
+ self.query = sql_query.clone()
1641
1657
  self.query.subquery = True
1642
1658
  self.extra = extra
1643
1659
  super().__init__(output_field)
@@ -1688,8 +1704,8 @@ class Exists(Subquery):
1688
1704
  output_field = fields.BooleanField()
1689
1705
  empty_result_set_value = False
1690
1706
 
1691
- def __init__(self, queryset: Any, **kwargs: Any):
1692
- super().__init__(queryset, **kwargs)
1707
+ def __init__(self, query: QuerySet[Any] | Query, **kwargs: Any):
1708
+ super().__init__(query, **kwargs)
1693
1709
  self.query = self.query.exists()
1694
1710
 
1695
1711
  def select_format(
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "plain.models"
3
- version = "0.51.0"
3
+ version = "0.51.1"
4
4
  description = "Model your data and store it in a database."
5
5
  authors = [{name = "Dave Gaeddert", email = "dave.gaeddert@dropseed.dev"}]
6
6
  readme = "README.md"
File without changes
File without changes
File without changes