diff --git a/django/db/backends/postgresql/features.py b/django/db/backends/postgresql/features.py index 5f63b6c713..23c31c0929 100644 --- a/django/db/backends/postgresql/features.py +++ b/django/db/backends/postgresql/features.py @@ -67,7 +67,6 @@ class DatabaseFeatures(BaseDatabaseFeatures): supports_update_conflicts_with_target = True supports_covering_indexes = True supports_stored_generated_columns = True - supports_virtual_generated_columns = False can_rename_index = True test_collations = { "deterministic": "C", @@ -168,9 +167,16 @@ class DatabaseFeatures(BaseDatabaseFeatures): def is_postgresql_17(self): return self.connection.pg_version >= 170000 + @cached_property + def is_postgresql_18(self): + return self.connection.pg_version >= 180000 + supports_unlimited_charfield = True supports_nulls_distinct_unique_constraints = property( operator.attrgetter("is_postgresql_15") ) supports_any_value = property(operator.attrgetter("is_postgresql_16")) + supports_virtual_generated_columns = property( + operator.attrgetter("is_postgresql_18") + ) diff --git a/docs/ref/models/fields.txt b/docs/ref/models/fields.txt index c178354db2..9a14d4ceb3 100644 --- a/docs/ref/models/fields.txt +++ b/docs/ref/models/fields.txt @@ -1302,8 +1302,8 @@ materialized view. real column. If ``False``, the column acts as a virtual column and does not occupy database storage space. - PostgreSQL only supports persisted columns. Oracle only supports virtual - columns. + PostgreSQL < 18 only supports persisted columns. Oracle only supports + virtual columns. .. admonition:: Database limitations