88orm
Advanced tools
| def create_reverse_many_to_one(model, payload): | ||
| from .connector import ORM88 | ||
| class RelatedManyToOneDescriptors(ORM88): | ||
| def __init__(self, *args, **kwargs): | ||
| kwargs.update({ | ||
| 'model': model | ||
| }) | ||
| super(RelatedManyToOneDescriptors, self).__init__(*args, **kwargs) | ||
| self._payload = payload | ||
| def all(self): | ||
| if self._result_cache: | ||
| return self | ||
| return super(RelatedManyToOneDescriptors, self).all() | ||
| return RelatedManyToOneDescriptors |
| Metadata-Version: 2.1 | ||
| Name: 88orm | ||
| Version: 0.1.1 | ||
| Version: 0.1.5 | ||
| Summary: ORM Service Connector | ||
@@ -5,0 +5,0 @@ Home-page: http://pypi.python.org/pypi/88orm/ |
@@ -10,2 +10,3 @@ README.md | ||
| orm88/connector.py | ||
| orm88/models.py | ||
| orm88/models.py | ||
| orm88/related_descriptors.py |
+8
-12
@@ -88,3 +88,3 @@ # -*- coding: utf-8 -*- | ||
| if data is None: | ||
| self.__bind() | ||
| self._bind() | ||
| data = self._result_cache.get('result') | ||
@@ -96,3 +96,3 @@ return iter(data) | ||
| if not count and self.__last_query: | ||
| self.__bind() | ||
| self._bind() | ||
| count = self._result_cache.get("count", 0) | ||
@@ -118,3 +118,3 @@ return count | ||
| return clone | ||
| _self = self.__bind() | ||
| _self = self._bind() | ||
| if _self == self: | ||
@@ -242,3 +242,3 @@ result_cache = self._result_cache.get('result') | ||
| if clone.__is_return_instance: | ||
| return clone.__bind() | ||
| return clone._bind() | ||
| return clone.fetch() | ||
@@ -258,4 +258,4 @@ return clone | ||
| clone = self.__class__( | ||
| model_name, | ||
| self._fields.copy(), | ||
| model=model_name, | ||
| fields=self._fields.copy(), | ||
| exclude_fields=exclude_fields | ||
@@ -275,3 +275,3 @@ ) | ||
| def __bind(self, model=None, data=None, with_relation=False): | ||
| def _bind(self, model=None, data=None): | ||
| if data is None: | ||
@@ -316,6 +316,2 @@ data = self.fetch() | ||
| def __bind_with_relation(self, relation_data): | ||
| data = self.fetch_with_relation(relation_data) | ||
| return self.__bind(data=data, with_relation=True) | ||
| # for custom method | ||
@@ -493,3 +489,3 @@ def call_manager_method(self, name, *args, **kwargs): | ||
| for index, orm_service in enumerate(payloads): | ||
| result.append(orm_service._ORM88__bind(data=response[index])) | ||
| result.append(orm_service._bind(data=response[index])) | ||
| return result | ||
@@ -496,0 +492,0 @@ |
+57
-16
@@ -8,2 +8,4 @@ import json | ||
| from .related_descriptors import create_reverse_many_to_one | ||
| # NOTE: All models info will be stored here. | ||
@@ -49,3 +51,9 @@ # contains fields and related_names, | ||
| def __repr__(self): | ||
| key = self._attrs.get('id') or self._attrs.get(next(iter(self._attrs))) | ||
| key = self._attrs.get( | ||
| '__str__', | ||
| (self._attrs.get('id') or | ||
| self._attrs.get( | ||
| next(iter(self._attrs)) | ||
| )) | ||
| ) | ||
| model_name = self.__model | ||
@@ -59,6 +67,13 @@ if model_name.islower(): | ||
| super(VirtualModel, self).__setattr__(key, value) | ||
| if key in self._fields: | ||
| if key in self._fields or key in self._related_names: | ||
| if isinstance(value, dict): | ||
| info = self._fields.get(key, self._related_names.get(key)) | ||
| related_model = info.get('related_model') | ||
| model = f"{related_model.get('app_label')}.{related_model.get('name')}" | ||
| value = self.__class__(model, self._payload, value=value) | ||
| super(VirtualModel, self).__setattr__(key, value) | ||
| self._attrs.update({ | ||
| key: value | ||
| }) | ||
| except Exception: | ||
@@ -81,11 +96,26 @@ pass | ||
| for key, value in self._fields.items(): | ||
| if not hasattr(self, key): | ||
| type_field = value.get('type') | ||
| if type_field in ['ForeignKey', 'OneToOneField']: | ||
| self._set_attr_single_instance(key, value) | ||
| elif type_field == 'ManyToManyField': | ||
| related_model = value.get('related_model') | ||
| model = f"{related_model.get('app_label')}.{related_model.get('name')}" | ||
| type_field = value.get('type') | ||
| if type_field in ['ForeignKey', 'OneToOneField']: | ||
| self._set_attr_single_instance(key, value) | ||
| elif type_field == 'ManyToManyField': | ||
| related_model = value.get('related_model') | ||
| model = f"{related_model.get('app_label')}.{related_model.get('name')}" | ||
| if hasattr(self, key): | ||
| _value = getattr(self, key) | ||
| if isinstance(_value, list): | ||
| attr_value = create_reverse_many_to_one(model, {})() | ||
| attr_value._bind(data=_value) | ||
| else: | ||
| attr_value = ORM88(model) | ||
| else: | ||
| attr_value = ORM88(model) | ||
| setattr(self, key, attr_value) | ||
| attr_value._payload.update({ | ||
| 'filter': { | ||
| 'args': [], | ||
| 'kwargs': { | ||
| related_model.get('related_query_name'): self.id | ||
| } | ||
| } | ||
| }) | ||
| setattr(self, key, attr_value) | ||
@@ -105,3 +135,3 @@ for key, value in self._related_names.items(): | ||
| def get_related(self, name): | ||
| def _get_related(self, name): | ||
| from .connector import ORM88 | ||
@@ -114,9 +144,10 @@ | ||
| if field.get('type') in ['ForeignKey', 'OneToOneField']: | ||
| return attr.get(id=self._attrs.get(f"{name}_id")) | ||
| attr = attr.get(id=self._attrs.get(f"{name}_id")) | ||
| setattr(self, name, attr) | ||
| return attr | ||
| elif field.get('type') == 'ManyToManyField': | ||
| key = field.get('related_model').get('related_query_name') | ||
| return attr.filter(**{key: self.id}) | ||
| return attr | ||
| return attr | ||
| def reverse_related(self, related_name): | ||
| def _reverse_related(self, related_name): | ||
| try: | ||
@@ -135,2 +166,7 @@ orm = getattr(self, related_name) # type: ORM88 | ||
| def rel(self, name): | ||
| if name in self._fields: | ||
| return self._get_related(name) | ||
| return self._reverse_related(name) | ||
| def refresh_from_db(self): | ||
@@ -160,4 +196,9 @@ from .connector import ORM88 | ||
| payload = self._payload.copy() | ||
| model_fields = {} | ||
| for field in self._fields: | ||
| model_fields.update({ | ||
| field: self._attrs.get(field) | ||
| }) | ||
| payload.get("payload").update({ | ||
| "save": self._attrs | ||
| "save": model_fields | ||
| }) | ||
@@ -164,0 +205,0 @@ return instance._save(payload) |
+1
-1
| Metadata-Version: 2.1 | ||
| Name: 88orm | ||
| Version: 0.1.1 | ||
| Version: 0.1.5 | ||
| Summary: ORM Service Connector | ||
@@ -5,0 +5,0 @@ Home-page: http://pypi.python.org/pypi/88orm/ |
+1
-1
@@ -8,3 +8,3 @@ import setuptools | ||
| name="88orm", | ||
| version="0.1.1", | ||
| version="0.1.5", | ||
| author="Rimba Prayoga", | ||
@@ -11,0 +11,0 @@ author_email="rimba47prayoga@gmail.com", |
Alert delta unavailable
Currently unable to show alert delta for PyPI packages.
26771
7.61%13
8.33%684
7.72%