Created
February 23, 2020 20:07
-
-
Save ychennay/316bbb48a94a0ac89f1f9f0c4046d7f4 to your computer and use it in GitHub Desktop.
Django model class
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class Model(metaclass=ModelBase): | |
def __init__(self, *args, **kwargs): | |
""" | |
initializes an instance of this data model | |
""" | |
@classmethod | |
def from_db(cls, db, field_names, values): | |
def __repr__(self): | |
return '<%s: %s>' % (self.__class__.__name__, self) | |
def __str__(self): | |
return '%s object (%s)' % (self.__class__.__name__, self.pk) | |
def __eq__(self, other): | |
if not isinstance(other, Model): | |
return False | |
if self._meta.concrete_model != other._meta.concrete_model: | |
return False | |
my_pk = self.pk | |
if my_pk is None: | |
return self is other | |
return my_pk == other.pk | |
def __hash__(self): | |
if self.pk is None: | |
raise TypeError("Model instances without primary key value are unhashable") | |
return hash(self.pk) | |
def __reduce__(self): | |
data = self.__getstate__() | |
data[DJANGO_VERSION_PICKLE_KEY] = get_version() | |
class_id = self._meta.app_label, self._meta.object_name | |
return model_unpickle, (class_id,), data | |
def __getstate__(self): | |
"""Hook to allow choosing the attributes to pickle.""" | |
return self.__dict__ | |
def __setstate__(self, state): | |
msg = None | |
pickled_version = state.get(DJANGO_VERSION_PICKLE_KEY) | |
if pickled_version: | |
current_version = get_version() | |
if current_version != pickled_version: | |
msg = ( | |
"Pickled model instance's Django version %s does not match " | |
"the current version %s." % (pickled_version, current_version) | |
) | |
else: | |
msg = "Pickled model instance's Django version is not specified." | |
if msg: | |
warnings.warn(msg, RuntimeWarning, stacklevel=2) | |
self.__dict__.update(state) | |
def _get_pk_val(self, meta=None): | |
meta = meta or self._meta | |
return getattr(self, meta.pk.attname) | |
def _set_pk_val(self, value): | |
return setattr(self, self._meta.pk.attname, value) | |
pk = property(_get_pk_val, _set_pk_val) | |
def get_deferred_fields(self): | |
""" | |
Return a set containing names of deferred fields for this instance. | |
""" | |
def refresh_from_db(self, using=None, fields=None): | |
""" | |
Reload field values from the database. | |
""" | |
def serializable_value(self, field_name): | |
""" | |
Return the value of the field name for this instance. If the field is | |
a foreign key, return the id value instead of the object. If there's | |
no Field object with this name on the model, return the model | |
attribute's value. | |
Used to serialize a field's value (in the serializer, or form output, | |
for example). Normally, you would just access the attribute directly | |
and not use this method. | |
""" | |
def save(self, force_insert=False, force_update=False, using=None, | |
update_fields=None): | |
""" | |
Save the current instance. Override this in a subclass if you want to | |
control the saving process. | |
The 'force_insert' and 'force_update' parameters can be used to insist | |
that the "save" must be an SQL insert or update (or equivalent for | |
non-SQL backends), respectively. Normally, they should not be set. | |
""" | |
def save_base(self, raw=False, force_insert=False, | |
force_update=False, using=None, update_fields=None): | |
""" | |
Handle the parts of saving which should be done only once per save, | |
yet need to be done in raw saves, too. This includes some sanity | |
checks and signal sending. | |
The 'raw' argument is telling save_base not to save any parent | |
models and not to do any changes to the values before save. This | |
is used by fixture loading. | |
""" | |
def _save_parents(self, cls, using, update_fields): | |
"""Save all the parents of cls using values from self.""" | |
... | |
def _save_table(self, raw=False, cls=None, force_insert=False, | |
force_update=False, using=None, update_fields=None): | |
""" | |
Do the heavy-lifting involved in saving. Update or insert the data | |
for a single table. | |
""" | |
... | |
def _do_update(self, base_qs, using, pk_val, values, update_fields, forced_update): | |
""" | |
Try to update the model. Return True if the model was updated (if an | |
update query was done and a matching row was found in the DB). | |
""" | |
... | |
def _do_insert(self, manager, using, fields, returning_fields, raw): | |
""" | |
Do an INSERT. If returning_fields is defined then this method should | |
return the newly created data for the model. | |
""" | |
def delete(self, using=None, keep_parents=False): | |
... | |
def _get_FIELD_display(self, field): | |
... |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment