|
1 | 1 | from fireo.fields import NestedModel |
2 | 2 | from fireo.queries import query_wrapper |
3 | 3 | from fireo.queries.base_query import BaseQuery |
| 4 | +from fireo.utils import utils |
4 | 5 |
|
5 | 6 |
|
6 | 7 | class UpdateQuery(BaseQuery): |
@@ -51,25 +52,27 @@ class User(Model): |
51 | 52 | # Check if it is nested model |
52 | 53 | if isinstance(f, NestedModel): |
53 | 54 | # Get nested model field |
54 | | - for nested_f in f.nested_model._meta.field_list.values(): |
55 | | - v = nested_f.get_value(self.query.get(f.name+"."+nested_f.name), ignore_required=True) |
56 | | - if v: |
57 | | - # create the name with parent field name and child name |
58 | | - # For example: |
59 | | - # class User(Model): |
60 | | - # address = TextField() |
61 | | - # class Student(Model): |
62 | | - # age = NumberField() |
63 | | - # user = NestedModel(User) |
64 | | - # |
65 | | - # Then the field name for nested model will be "user.address" |
66 | | - field_dict[f.db_column_name+"."+nested_f.db_column_name] = v |
| 55 | + self._nested_field_list(f, field_dict, f.name) |
67 | 56 | else: |
68 | 57 | v = f.get_value(self.query.get(f.name), ignore_required=True) |
69 | 58 | if v: |
70 | 59 | field_dict[f.db_column_name] = v |
71 | 60 | return field_dict |
72 | 61 |
|
| 62 | + def _nested_field_list(self, f, fl, *name): |
| 63 | + """Get Nested Fields""" |
| 64 | + nested_field_list = {} |
| 65 | + for n_f in f.nested_model._meta.field_list.values(): |
| 66 | + if isinstance(n_f, NestedModel): |
| 67 | + n = (*name, n_f.name) |
| 68 | + self._nested_field_list(n_f, nested_field_list, *n) |
| 69 | + else: |
| 70 | + nested_field_list[n_f.db_column_name] = n_f.get_value( |
| 71 | + utils.get_nested(self.query, *name).get(n_f.name), |
| 72 | + ignore_required=True |
| 73 | + ) |
| 74 | + fl[f.db_column_name] = nested_field_list |
| 75 | + |
73 | 76 | def _raw_exec(self): |
74 | 77 | """Update document in firestore and return the document""" |
75 | 78 | ref = self._doc_ref() |
|
0 commit comments