(cls: type[MODEL], **kwargs: Any)
| 811 | |
| 812 | @classmethod |
| 813 | def _init_from_db(cls: type[MODEL], **kwargs: Any) -> MODEL: |
| 814 | self = cls.__new__(cls) |
| 815 | self._partial = False |
| 816 | self._saved_in_db = True |
| 817 | self._custom_generated_pk = self._meta.db_pk_column not in self._meta.generated_db_fields |
| 818 | self._await_when_save = {} |
| 819 | |
| 820 | meta = self._meta |
| 821 | _setattr = object.__setattr__ # bypass __setattr__ override for performance |
| 822 | try: |
| 823 | # This is like so for performance reasons. |
| 824 | # We want to avoid conditionals and calling .to_python_value() |
| 825 | # Native fields are fields that are already converted to/from python to DB type |
| 826 | # by the DB driver |
| 827 | for key, model_field, field in meta.db_native_fields: |
| 828 | _setattr(self, model_field, kwargs[key]) |
| 829 | # Fields that don't override .to_python_value() are converted without a call |
| 830 | # as we already know what we will be doing. |
| 831 | for key, model_field, field in meta.db_default_fields: |
| 832 | if (value := kwargs[key]) is not None: |
| 833 | value = field.field_type(value) |
| 834 | _setattr(self, model_field, value) |
| 835 | # These fields need manual .to_python_value() |
| 836 | for key, model_field, field in meta.db_complex_fields: |
| 837 | _setattr(self, model_field, field.to_python_value(kwargs[key])) |
| 838 | except KeyError: |
| 839 | # Partial model (.only() query) — slower but correct fallback |
| 840 | self._partial = True |
| 841 | native_keys = {k for k, _, _ in meta.db_native_fields} |
| 842 | default_keys = {k for k, _, _ in meta.db_default_fields} |
| 843 | for key, value in kwargs.items(): |
| 844 | if key not in meta.fields_map: |
| 845 | continue |
| 846 | field = meta.fields_map[key] |
| 847 | if key not in native_keys: |
| 848 | if key in default_keys: |
| 849 | if value is not None: |
| 850 | value = field.field_type(value) |
| 851 | else: |
| 852 | value = field.to_python_value(value) |
| 853 | model_field = meta.fields_db_projection_reverse.get(key, key) |
| 854 | _setattr(self, model_field, value) |
| 855 | |
| 856 | return self |
| 857 | |
| 858 | def __str__(self) -> str: |
| 859 | return f"<{self.__class__.__name__}>" |
no test coverage detected