# files.File ## Model Info | Key | Value | |---|-----| | Model Name | File | | Verbose Name | file | | Verbose Name Plural | files | | Docstring | <p>File(created, modified, id, version, file, size, hash, original\_hash, status, datestatuschanged, strict\_compatibility, approval\_date, cert\_serial\_num, is\_signed, is\_experiment, is\_mozilla\_signed\_extension, original\_status, status\_disabled\_reason, manifest\_version)</p> | | Is Abstract | False | | Is Proxy | False | | Is Managed | True | | Ordering | [] | | Permissions | [] | | Default Permissions | ('add', 'change', 'delete', 'view') | | Indexes | [<Index: fields=['created', 'version'] name='created_idx'>, <Index: fields=['datestatuschanged', 'version'] name='statuschanged_idx'>, <Index: fields=['status'] name='status'>] | | Constraints | [] | | Database Table | files | | Base Manager | objects | | Default Manager | None | | File | /data/olympia/src/olympia/files/models.py | | Starting Line Number | 87 | | Method Resolution Order | (<class 'olympia.files.models.File'>, <class 'olympia.amo.models.OnChangeMixin'>, <class 'olympia.amo.models.ModelBase'>, <class 'olympia.amo.models.SaveUpdateMixin'>, <class 'django.db.models.base.Model'>, <class 'django.db.models.utils.AltersData'>, <class 'object'>) | ## Fields | Field Name | Field Type | Database Column | Database Type | Verbose Name | |----------|----------|---------------|-------------|------------| | `_webext_permissions` | OneToOneRel | | integer UNSIGNED | | | `approval_date` | DateTimeField | approval_date | datetime(6) | approval date | | `cert_serial_num` | TextField | cert_serial_num | longtext | cert serial num | | `created` | DateTimeField | created | datetime(6) | created | | `datestatuschanged` | DateTimeField | datestatuschanged | datetime(6) | datestatuschanged | | `file` | FileField | filename | varchar(255) | file | | `file_manifest` | OneToOneRel | | integer UNSIGNED | | | `hash` | CharField | hash | varchar(255) | hash | | `id (pk)` | PositiveAutoField | id | integer UNSIGNED AUTO_INCREMENT | id | | `is_experiment` | BooleanField | is_experiment | bool | is experiment | | `is_mozilla_signed_extension` | BooleanField | is_mozilla_signed_extension | bool | is mozilla signed extension | | `is_signed` | BooleanField | is_signed | bool | is signed | | `manifest_version` | SmallIntegerField | manifest_version | smallint | manifest version | | `modified` | DateTimeField | modified | datetime(6) | modified | | `original_hash` | CharField | original_hash | varchar(255) | original hash | | `original_status` | PositiveSmallIntegerField | original_status | smallint UNSIGNED | original status | | `size` | PositiveIntegerField | size | integer UNSIGNED | size | | `status` | PositiveSmallIntegerField | status | smallint UNSIGNED | status | | `status_disabled_reason` | PositiveSmallIntegerField | status_disabled_reason | smallint UNSIGNED | status disabled reason | | `strict_compatibility` | BooleanField | strict_compatibility | bool | strict compatibility | | `validation` | OneToOneRel | | integer UNSIGNED | | | `version` | OneToOneField | version_id | integer UNSIGNED | version | ## Relations | Field Name | Field Type | Database Column | Database Type | Related Model | Related Name | |----------|----------|---------------|-------------|-------------|------------| | `version` | OneToOneField | version_id | integer UNSIGNED | versions.Version | file_set | fields_reverse_relation=[FieldReverseRelation(name='validation', field_type='OneToOneRel', field_db_type='integer UNSIGNED', related_model='files.FileValidation', field_name_on_related_model='file', field_type_on_related_model='OneToOneField'), FieldReverseRelation(name='_webext_permissions', field_type='OneToOneRel', field_db_type='integer UNSIGNED', related_model='files.WebextPermission', field_name_on_related_model='file', field_type_on_related_model='OneToOneField'), FieldReverseRelation(name='file_manifest', field_type='OneToOneRel', field_db_type='integer UNSIGNED', related_model='files.FileManifest', field_name_on_related_model='file', field_type_on_related_model='OneToOneField')] ## Reverse Relations | Field Name | Field Type | Database Type | Related Model | Field Name on Related Model | Field Type on Related Model | |----------|----------|-------------|-------------|---------------------------|---------------------------| | `_webext_permissions` | OneToOneRel | integer UNSIGNED | files.WebextPermission | file | OneToOneField | | `file_manifest` | OneToOneRel | integer UNSIGNED | files.FileManifest | file | OneToOneField | | `validation` | OneToOneRel | integer UNSIGNED | files.FileValidation | file | OneToOneField | ## Methods ### Other Methods | Method Name | Signature | |-----------|---------| | `from_upload` | `(upload, version, parsed_data=None)` | | `generate_hash` | `(self)` | | `get_admin_absolute_url` | `(self)` | | `get_admin_url_path` | `(self)` | | `get_manifest_version_display` | `(self, *, field=<django.db.models.fields.SmallIntegerField: manifest_version>)` | | `get_next_by_created` | `(self, *, field=<django.db.models.fields.DateTimeField: created>, is_next=True, **kwargs)` | | `get_next_by_modified` | `(self, *, field=<django.db.models.fields.DateTimeField: modified>, is_next=True, **kwargs)` | | `get_previous_by_created` | `(self, *, field=<django.db.models.fields.DateTimeField: created>, is_next=False, **kwargs)` | | `get_previous_by_modified` | `(self, *, field=<django.db.models.fields.DateTimeField: modified>, is_next=False, **kwargs)` | | `get_review_status_display` | `(self)` | | `get_status_disabled_reason_display` | `(self, *, field=<django.db.models.fields.PositiveSmallIntegerField: status_disabled_reason>)` | | `get_status_display` | `(self, *, field=<django.db.models.fields.PositiveSmallIntegerField: status>)` | | `get_unfiltered_manager` | `()` | | `get_url_path` | `(self, attachment=False)` | | `latest_xpi_url` | `(self, attachment=False)` | | `on_change` | `(callback)` | | `reload` | `(self)` | | `serializable_reference` | `(self)` | | `update` | `(self, **kwargs)` | ### Private Methods | Method Name | Signature | |-----------|---------| | `_get_field_value_map` | `(self, meta, exclude=None)` | | `_permissions_wrapper` | `(self, prop)` | | `_reset_initial_attrs` | `(self, attrs=None)` | | `_send_changes` | `(self, old_attr, new_attr_kw)` | ## Custom Managers ### default **Class:** `FileManager` *Base for all managers in AMO. Returns BaseQuerySets. If a model has translated fields, they'll be attached through a transform function.* #### Custom Methods ##### `disabled_that_would_be_renabled_with_addon(self)` ##### `transform(self, fn)` #### Custom QuerySet **Class:** `BaseQuerySet` *Represent a lazy database lookup for a set of objects.* ##### Custom Methods ###### `no_transforms(self)` ###### `only_translations(self)` *Remove all transforms except translations.* ###### `optimized_count(self)` *Slightly optimized count() for cases where there is a DISTINCT in the queryset. When a count() call is made on a queryset that has a distinct, that causes django to run the full SELECT (including all fields, distinct, ordering etc) in a subquery and then COUNT() on the result of that subquery, which is costly/innefficient. That's tracked in https://code.djangoproject.com/ticket/30685. We can't easily fix the fact that there is a subquery, but we can avoid selecting all fields and ordering in that subquery needlessly.* ###### `pop_transforms(self)` ###### `transform(self, fn)` ### objects **Class:** `FileManager` *Base for all managers in AMO. Returns BaseQuerySets. If a model has translated fields, they'll be attached through a transform function.* #### Custom Methods ##### `disabled_that_would_be_renabled_with_addon(self)` ##### `transform(self, fn)` #### Custom QuerySet **Class:** `BaseQuerySet` *Represent a lazy database lookup for a set of objects.* ##### Custom Methods ###### `no_transforms(self)` ###### `only_translations(self)` *Remove all transforms except translations.* ###### `optimized_count(self)` *Slightly optimized count() for cases where there is a DISTINCT in the queryset. When a count() call is made on a queryset that has a distinct, that causes django to run the full SELECT (including all fields, distinct, ordering etc) in a subquery and then COUNT() on the result of that subquery, which is costly/innefficient. That's tracked in https://code.djangoproject.com/ticket/30685. We can't easily fix the fact that there is a subquery, but we can avoid selecting all fields and ordering in that subquery needlessly.* ###### `pop_transforms(self)` ###### `transform(self, fn)` --- !!! THIS DOCUMENT WAS *AUTOGENERATED* ON 2025-07-30 !!!