From 2a21ae872cfdabb1a852f94cec746e9327888c3a Mon Sep 17 00:00:00 2001 From: nesdis <nesdis@gmail.com> Date: Fri, 14 Aug 2020 10:43:05 +0200 Subject: [PATCH] Changes for handling queries within embedded fields. --- djongo/models/fields.py | 19 ++++- .../xtest_app/tests/test_canvas.py | 76 ++++++++----------- .../xtest_app/tests/test_models.py | 7 +- 3 files changed, 52 insertions(+), 50 deletions(-) diff --git a/djongo/models/fields.py b/djongo/models/fields.py index 327de02..5c70ef4 100644 --- a/djongo/models/fields.py +++ b/djongo/models/fields.py @@ -138,6 +138,19 @@ class ModelField(MongoField): value: dict, *other_args): processed_value = {} + for field in self.model_container._meta.get_fields(): + try: + field_value = value[field.attname] + except KeyError: + continue + processed_value[field.attname] = getattr(field, func_name)(field_value, *other_args) + return processed_value + + def _save_value_thru_fields(self, + func_name: str, + value: dict, + *other_args): + processed_value = {} errors = {} for field in self.model_container._meta.get_fields(): try: @@ -212,8 +225,12 @@ class ModelField(MongoField): if not isinstance(value, self.base_type): raise ValueError( f'Value: {value} must be an instance of {self.base_type}') - return self.get_prep_value(value) + processed_value = self._save_value_thru_fields('get_db_prep_save', + value, + connection) + return processed_value + def get_prep_value(self, value): if (value is None or not isinstance(value, self.base_type)): diff --git a/tests/djongo_tests/test_project/xtest_app/tests/test_canvas.py b/tests/djongo_tests/test_project/xtest_app/tests/test_canvas.py index 537cf2b..9b29d6b 100644 --- a/tests/djongo_tests/test_project/xtest_app/tests/test_canvas.py +++ b/tests/djongo_tests/test_project/xtest_app/tests/test_canvas.py @@ -1,44 +1,32 @@ -from django.test import TransactionTestCase -from threading import Thread - -from xtest_app.models.canvas_models_id import ForeignKey1, ForeignKey2, DummyObject - -def make_request(): - objects = DummyObject.objects.all() - - print(objects) - -class MetaScanConcurrencyTest(TransactionTestCase): - def setUp(self): - foreign_key_1 = ForeignKey1.create(**{ - "name": "foreign_key_1" - }) - - foreign_key_2 = ForeignKey2.create(**{ - "name": "foreign_key_2" - }) - - foreign_key_1.save() - foreign_key_2.save() - - for i in range(0, 1): - dummy = DummyObject.create(**{ - "foreign_key_1": foreign_key_1, - "foreign_key_2": foreign_key_2 - }) - - dummy.save() - - def test_concurrency_test(self): - threads = [] - for i in range(0, 100): - t = Thread(target=make_request) - threads.append(t) - t.start() - # Thread(target=make_request).start() - - for thread in threads: - thread.join() - # objects = DummyObject.objects.all() - # - # print(objects) \ No newline at end of file +from django.db.models import QuerySet + +from . import TestCase +from djongo import models + +class Team(models.Model): + id = models.TextField() + extra = models.JSONField(null=True) + + class Meta: + abstract = True + +class DocumentQuerySet(QuerySet): + def from_team(self, team_id: str): + return self.filter(team={'id': team_id}) + +class Document(models.Model): + team = models.EmbeddedField(model_container=Team) + objects = models.DjongoManager.from_queryset(DocumentQuerySet)() + +class Document2(models.Model): + team = models.CharField(max_length=10) + objects = models.DjongoManager.from_queryset(DocumentQuerySet)() + +class TestCanvas(TestCase): + + def test_canvas(self): + entry = Document.objects.create( + team={'id': 'an id', 'extra': {'a': 1}} + ) + b_entry = Document.objects.from_team('an id') + print(b_entry) diff --git a/tests/djongo_tests/test_project/xtest_app/tests/test_models.py b/tests/djongo_tests/test_project/xtest_app/tests/test_models.py index 239d68b..b69efc2 100644 --- a/tests/djongo_tests/test_project/xtest_app/tests/test_models.py +++ b/tests/djongo_tests/test_project/xtest_app/tests/test_models.py @@ -1,8 +1,5 @@ from unittest import skip - from django.core.exceptions import ValidationError - -import xtest_app.models.basic_field from djongo.exceptions import NotSupportedError from xtest_app.models.basic_field import BasicBlog, BasicRelatedEntry, BasicAuthor from . import TestCase @@ -20,8 +17,8 @@ class FieldTests(TestCase): headline_query: dict blog_query: dict mut: U[Type[models.Model], type] - entry: xtest_app.models.basic_field.EmbeddedFieldEntry - db_entry: xtest_app.models.basic_field.EmbeddedFieldEntry + entry: basic_field.EmbeddedFieldEntry + db_entry: basic_field.EmbeddedFieldEntry def get_model(self, **embedded_field_kwargs) -> U[Type[models.Model], type]: -- GitLab