Iterators QuerySet Method (#688)
* feat: add iterator function with sample docstring * feat: implement the iterator queryset method * feat: completed the docstring of iterator method * test: write test function to check iterator result * refactor: use iterate method instead fetch_all * fix: debuging syntax error in kwargs of iterator * feat: write a base sample doc for iterator method * refactor: add ouput comment iterator docs example * refactor: check change pk yield ormar model * test: write new test to coverage iterator queryset * fix: debuging new user model class 3 number * fix: iterate on user3 model class * fix: debug id field in user3 model by main user * fix: remove prefetch_related for iterator method * fix: debug mypy test for type annotation * fix: added type annotation for rows variable * simplify row checks as processing is expensive, raise exception on prefetch_related with iterator * fix coverage * fix mypy, bump mypy in pre-commit to newest version * refactor: update document and test uuid pk type * feat: write docs of iterate in quesrysetproxy * feat: write iterate method querysetproxy tests * fix: debuging new test written uuid pk * refactor: seperate iterate test modules * refactor: change description and handle empty set * feat: added iterate method in readme files * fix: set pragma: no cover for raised test Co-authored-by: collerek <collerek@gmail.com>
This commit is contained in:
@ -173,6 +173,45 @@ tracks = await Track.objects.all()
|
||||
|
||||
```
|
||||
|
||||
## iterate
|
||||
|
||||
`iterate(*args, **kwargs) -> AsyncGenerator["Model"]`
|
||||
|
||||
Return async iterable generator for all rows from a database for given model.
|
||||
|
||||
Passing args and/or kwargs is a shortcut and equals to calling `filter(*args, **kwargs).iterate()`.
|
||||
|
||||
If there are no rows meeting the criteria an empty async generator is returned.
|
||||
|
||||
```python
|
||||
class Album(ormar.Model):
|
||||
class Meta:
|
||||
tablename = "album"
|
||||
metadata = metadata
|
||||
database = database
|
||||
|
||||
id: int = ormar.Integer(primary_key=True)
|
||||
name: str = ormar.String(max_length=100)
|
||||
```
|
||||
|
||||
```python
|
||||
await Album.objects.create(name='The Cat')
|
||||
await Album.objects.create(name='The Dog')
|
||||
# will asynchronously iterate all Album models yielding one main model at a time from the generator
|
||||
async for album in Album.objects.iterate():
|
||||
print(album.name)
|
||||
|
||||
# The Cat
|
||||
# The Dog
|
||||
|
||||
```
|
||||
|
||||
!!!warning
|
||||
Use of `iterate()` causes previous `prefetch_related()` calls to be ignored;
|
||||
since these two optimizations do not make sense together.
|
||||
|
||||
If `iterate()` & `prefetch_related()` are used together the `QueryDefinitionError` exception is raised.
|
||||
|
||||
## Model methods
|
||||
|
||||
Each model instance have a set of methods to `save`, `update` or `load` itself.
|
||||
@ -235,4 +274,4 @@ objects from other side of the relation.
|
||||
To read more about `QuerysetProxy` visit [querysetproxy][querysetproxy] section
|
||||
|
||||
|
||||
[querysetproxy]: ../relations/queryset-proxy.md
|
||||
[querysetproxy]: ../relations/queryset-proxy.md
|
||||
|
||||
Reference in New Issue
Block a user