exclude through models

This commit is contained in:
collerek
2021-06-06 15:58:38 +02:00
parent fa061e06eb
commit 13a8655126
4 changed files with 63 additions and 3 deletions

View File

@ -168,7 +168,7 @@ By default `Through` model relation names default to related model name in lower
So in example like this: So in example like this:
```python ```python
... # course declaration ommited ... # course declaration omitted
class Student(ormar.Model): class Student(ormar.Model):
class Meta: class Meta:
database = database database = database

View File

@ -217,7 +217,11 @@ class ModelRow(NewBaseModel):
used_prefixes=used_prefixes, used_prefixes=used_prefixes,
) )
item[model_cls.get_column_name_from_alias(related)] = child item[model_cls.get_column_name_from_alias(related)] = child
if field.is_multi and child: if (
field.is_multi
and child
and not model_excludable.is_excluded(field.through.get_name())
):
cls._populate_through_instance( cls._populate_through_instance(
row=row, row=row,
item=item, item=item,

View File

@ -230,3 +230,58 @@ async def test_selecting_subset():
await Car.objects.select_related("manufacturer").fields( await Car.objects.select_related("manufacturer").fields(
["id", "name", "manufacturer__founded"] ["id", "name", "manufacturer__founded"]
).all() ).all()
@pytest.mark.asyncio
async def test_selecting_subset_of_through_model():
async with database:
car = (
await Car.objects.select_related(["manufacturer__hq__nicks"])
.fields(
{
"id": ...,
"name": ...,
"manufacturer": {
"name": ...,
"hq": {"name": ..., "nicks": {"name": ...}},
},
}
)
.exclude_fields("manufacturer__hq__nickshq")
.get()
)
assert car.manufacturer.hq.nicks[0].nickshq is None
car = (
await Car.objects.select_related(["manufacturer__hq__nicks"])
.fields(
{
"id": ...,
"name": ...,
"manufacturer": {
"name": ...,
"hq": {"name": ..., "nicks": {"name": ...}},
},
}
)
.exclude_fields({"manufacturer": {"hq": {"nickshq": ...}}})
.get()
)
assert car.manufacturer.hq.nicks[0].nickshq is None
car = (
await Car.objects.select_related(["manufacturer__hq__nicks"])
.fields(
{
"id": ...,
"name": ...,
"manufacturer": {
"name": ...,
"hq": {"name": ..., "nicks": {"name": ...}},
},
}
)
.exclude_fields("manufacturer__hq__nickshq__nick")
.get()
)
assert car.manufacturer.hq.nicks[0].nickshq is not None

View File

@ -261,7 +261,8 @@ async def test_nested_m2m_values_subset_of_fields():
user = ( user = (
await Role.objects.select_related("users__categories") await Role.objects.select_related("users__categories")
.filter(name="admin") .filter(name="admin")
.fields({"name": ..., "users": {"name": ...}}) .fields({"name": ..., "users": {"name": ..., "categories": {"name"}}})
.exclude_fields("users__roleuser")
.values() .values()
) )
assert user == [ assert user == [