Relation container for :func:`.ForeignKeyField`.
| 31 | |
| 32 | |
| 33 | class ReverseRelation(Generic[MODEL]): |
| 34 | """ |
| 35 | Relation container for :func:`.ForeignKeyField`. |
| 36 | """ |
| 37 | |
| 38 | def __init__( |
| 39 | self, |
| 40 | remote_model: type[MODEL], |
| 41 | relation_field: str, |
| 42 | instance: Model, |
| 43 | from_field: str, |
| 44 | ) -> None: |
| 45 | self.remote_model = remote_model |
| 46 | self.relation_field = relation_field |
| 47 | self.instance = instance |
| 48 | self.from_field = from_field |
| 49 | self._fetched = False |
| 50 | self._custom_query = False |
| 51 | self.related_objects: list[MODEL] = [] |
| 52 | |
| 53 | @property |
| 54 | def _query(self) -> QuerySet[MODEL]: |
| 55 | if not self.instance._saved_in_db: |
| 56 | raise OperationalError( |
| 57 | "This objects hasn't been instanced, call .save() before calling related queries" |
| 58 | ) |
| 59 | return self.remote_model.filter( |
| 60 | **{self.relation_field: getattr(self.instance, self.from_field)} |
| 61 | ) |
| 62 | |
| 63 | def __contains__(self, item: Any) -> bool: |
| 64 | self._raise_if_not_fetched() |
| 65 | return item in self.related_objects |
| 66 | |
| 67 | def __iter__(self) -> Iterator[MODEL]: |
| 68 | self._raise_if_not_fetched() |
| 69 | return self.related_objects.__iter__() |
| 70 | |
| 71 | def __len__(self) -> int: |
| 72 | self._raise_if_not_fetched() |
| 73 | return len(self.related_objects) |
| 74 | |
| 75 | def __bool__(self) -> bool: |
| 76 | self._raise_if_not_fetched() |
| 77 | return bool(self.related_objects) |
| 78 | |
| 79 | def __getitem__(self, item: int) -> MODEL: |
| 80 | self._raise_if_not_fetched() |
| 81 | return self.related_objects[item] |
| 82 | |
| 83 | def __await__(self) -> Generator[Any, None, list[MODEL]]: |
| 84 | return self._query.__await__() |
| 85 | |
| 86 | async def __aiter__(self) -> AsyncGenerator[MODEL, None]: |
| 87 | if not self._fetched: |
| 88 | self._set_result_for_query(await self) |
| 89 | for val in self.related_objects: |
| 90 | yield val |
no outgoing calls
no test coverage detected
searching dependent graphs…