(self)
| 1798 | return placeholder_rows, param_rows |
| 1799 | |
| 1800 | def as_sql(self): |
| 1801 | qn = self.quote_name |
| 1802 | opts = self.query.get_meta() |
| 1803 | insert_statement = self.connection.ops.insert_statement( |
| 1804 | on_conflict=self.query.on_conflict, |
| 1805 | ) |
| 1806 | result = ["%s %s" % (insert_statement, qn(opts.db_table))] |
| 1807 | |
| 1808 | if fields := list(self.query.fields): |
| 1809 | from django.db.models.expressions import DatabaseDefault |
| 1810 | |
| 1811 | supports_default_keyword_in_bulk_insert = ( |
| 1812 | self.connection.features.supports_default_keyword_in_bulk_insert |
| 1813 | ) |
| 1814 | value_cols = [] |
| 1815 | for field in list(fields): |
| 1816 | field_prepare = partial(self.prepare_value, field) |
| 1817 | field_pre_save = partial(self.pre_save_val, field) |
| 1818 | |
| 1819 | field_values = [] |
| 1820 | for obj in self.query.objs: |
| 1821 | value = field_pre_save(obj) |
| 1822 | if not isinstance(value, DatabaseDefault): |
| 1823 | value = field_prepare(value) |
| 1824 | field_values.append(value) |
| 1825 | |
| 1826 | if not field.has_db_default(): |
| 1827 | value_cols.append(field_values) |
| 1828 | continue |
| 1829 | |
| 1830 | # If all values are DEFAULT don't include the field and its |
| 1831 | # values in the query as they are redundant and could prevent |
| 1832 | # optimizations. This cannot be done if we're dealing with the |
| 1833 | # last field as INSERT statements require at least one. |
| 1834 | if len(fields) > 1 and all( |
| 1835 | isinstance(value, DatabaseDefault) for value in field_values |
| 1836 | ): |
| 1837 | fields.remove(field) |
| 1838 | continue |
| 1839 | |
| 1840 | if supports_default_keyword_in_bulk_insert: |
| 1841 | value_cols.append(field_values) |
| 1842 | continue |
| 1843 | |
| 1844 | # If the field cannot be excluded from the INSERT for the |
| 1845 | # reasons listed above and the backend doesn't support the |
| 1846 | # DEFAULT keyword each values must be expanded into their |
| 1847 | # underlying expressions. |
| 1848 | prepared_db_default = field_prepare(field.db_default) |
| 1849 | field_values = [ |
| 1850 | ( |
| 1851 | prepared_db_default |
| 1852 | if isinstance(value, DatabaseDefault) |
| 1853 | else value |
| 1854 | ) |
| 1855 | for value in field_values |
| 1856 | ] |
| 1857 | value_cols.append(field_values) |
no test coverage detected