Skip to content

Commit

Permalink
Add support for bulk_create (#146)
Browse files Browse the repository at this point in the history
Co-authored-by: Amin Alaee <mohammadamin.alaee@gmail.com>
  • Loading branch information
Mng-dev-ai and aminalaee committed Jan 7, 2022
1 parent ea14b68 commit 0df624e
Show file tree
Hide file tree
Showing 3 changed files with 42 additions and 4 deletions.
14 changes: 14 additions & 0 deletions docs/making_queries.md
Expand Up @@ -141,6 +141,20 @@ await Note.objects.create(text="Call Mum.", completed=True)
await Note.objects.create(text="Send invoices.", completed=True)
```

### .bulk_create()

You need to pass a list of dictionaries of required fields to create multiple objects:

```python
await Product.objects.bulk_create(
[
{"data": {"foo": 123}, "value": 123.456, "status": StatusEnum.RELEASED},
{"data": {"foo": 456}, "value": 456.789, "status": StatusEnum.DRAFT},

]
)
```

### .delete()

You can `delete` instances by calling `.delete()` on a queryset:
Expand Down
15 changes: 11 additions & 4 deletions orm/models.py
Expand Up @@ -23,9 +23,7 @@

def _update_auto_now_fields(values, fields):
for key, value in fields.items():
if isinstance(value, DateTime) and value.auto_now:
values[key] = value.validator.get_default_value()
elif isinstance(value, Date) and value.auto_now:
if isinstance(value, (DateTime, Date)) and value.auto_now:
values[key] = value.validator.get_default_value()
return values

Expand Down Expand Up @@ -403,7 +401,7 @@ async def first(self, **kwargs):
if rows:
return rows[0]

async def create(self, **kwargs):
def _validate_kwargs(self, **kwargs):
fields = self.model_cls.fields
validator = typesystem.Schema(
fields={key: value.validator for key, value in fields.items()}
Expand All @@ -412,7 +410,10 @@ async def create(self, **kwargs):
for key, value in fields.items():
if value.validator.read_only and value.validator.has_default():
kwargs[key] = value.validator.get_default_value()
return kwargs

async def create(self, **kwargs):
kwargs = self._validate_kwargs(**kwargs)
instance = self.model_cls(**kwargs)
expr = self.table.insert().values(**kwargs)

Expand All @@ -423,6 +424,12 @@ async def create(self, **kwargs):

return instance

async def bulk_create(self, objs: typing.List[typing.Dict]) -> None:
new_objs = [self._validate_kwargs(**obj) for obj in objs]

expr = self.table.insert().values(new_objs)
await self.database.execute(expr)

async def delete(self) -> None:
expr = self.table.delete()
for filter_clause in self.filter_clauses:
Expand Down
17 changes: 17 additions & 0 deletions tests/test_columns.py
Expand Up @@ -142,3 +142,20 @@ class Product(orm.Model):
}

await Product.objects.create()


async def test_bulk_create():
await Product.objects.bulk_create(
[
{"data": {"foo": 123}, "value": 123.456, "status": StatusEnum.RELEASED},
{"data": {"foo": 456}, "value": 456.789, "status": StatusEnum.DRAFT},
]
)
products = await Product.objects.all()
assert len(products) == 2
assert products[0].data == {"foo": 123}
assert products[0].value == 123.456
assert products[0].status == StatusEnum.RELEASED
assert products[1].data == {"foo": 456}
assert products[1].value == 456.789
assert products[1].status == StatusEnum.DRAFT

0 comments on commit 0df624e

Please sign in to comment.