exclude through models
This commit is contained in:
@ -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
|
||||||
|
|||||||
@ -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,
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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 == [
|
||||||
|
|||||||
Reference in New Issue
Block a user