extract filters into filter actions and delay their processing time to allow for registration of complex relations, refactoring and optimization, now one join with relations with same aliases are possible
This commit is contained in:
@ -187,31 +187,44 @@ async def test_m2m_self_forwardref_relation(cleanup):
|
||||
await billy.friends.add(steve)
|
||||
|
||||
billy_check = await Child.objects.select_related(
|
||||
["friends", "favourite_game", "least_favourite_game",
|
||||
"friends__favourite_game", "friends__least_favourite_game"]
|
||||
[
|
||||
"friends",
|
||||
"favourite_game",
|
||||
"least_favourite_game",
|
||||
"friends__favourite_game",
|
||||
"friends__least_favourite_game",
|
||||
]
|
||||
).get(name="Billy")
|
||||
assert len(billy_check.friends) == 2
|
||||
assert billy_check.friends[0].name == "Kate"
|
||||
assert billy_check.friends[0].favourite_game.name == 'Checkers'
|
||||
assert billy_check.friends[0].least_favourite_game.name == 'Uno'
|
||||
assert billy_check.friends[0].favourite_game.name == "Checkers"
|
||||
assert billy_check.friends[0].least_favourite_game.name == "Uno"
|
||||
assert billy_check.friends[1].name == "Steve"
|
||||
assert billy_check.friends[1].favourite_game.name == 'Jenga'
|
||||
assert billy_check.friends[1].least_favourite_game.name == 'Uno'
|
||||
assert billy_check.friends[1].favourite_game.name == "Jenga"
|
||||
assert billy_check.friends[1].least_favourite_game.name == "Uno"
|
||||
assert billy_check.favourite_game.name == "Uno"
|
||||
|
||||
kate_check = await Child.objects.select_related(["also_friends",]).get(
|
||||
kate_check = await Child.objects.select_related(["also_friends"]).get(
|
||||
name="Kate"
|
||||
)
|
||||
|
||||
assert len(kate_check.also_friends) == 1
|
||||
assert kate_check.also_friends[0].name == "Billy"
|
||||
|
||||
# TODO: Fix filters with complex prefixes
|
||||
# billy_check = await Child.objects.select_related(
|
||||
# ["friends", "favourite_game", "least_favourite_game",
|
||||
# "friends__favourite_game", "friends__least_favourite_game"]
|
||||
# ).filter(friends__favourite_game__name="Checkers").get(name="Billy")
|
||||
# assert len(billy_check.friends) == 1
|
||||
# assert billy_check.friends[0].name == "Kate"
|
||||
# assert billy_check.friends[0].favourite_game.name == 'Checkers'
|
||||
# assert billy_check.friends[0].least_favourite_game.name == 'Uno'
|
||||
billy_check = (
|
||||
await Child.objects.select_related(
|
||||
[
|
||||
"friends",
|
||||
"favourite_game",
|
||||
"least_favourite_game",
|
||||
"friends__favourite_game",
|
||||
"friends__least_favourite_game",
|
||||
]
|
||||
)
|
||||
.filter(friends__favourite_game__name="Checkers")
|
||||
.get(name="Billy")
|
||||
)
|
||||
assert len(billy_check.friends) == 1
|
||||
assert billy_check.friends[0].name == "Kate"
|
||||
assert billy_check.friends[0].favourite_game.name == "Checkers"
|
||||
assert billy_check.friends[0].least_favourite_game.name == "Uno"
|
||||
|
||||
@ -2,8 +2,16 @@ from ormar.models.helpers.models import group_related_list
|
||||
|
||||
|
||||
def test_group_related_list():
|
||||
given = ['friends__least_favourite_game', 'least_favourite_game', 'friends',
|
||||
'favourite_game', 'friends__favourite_game']
|
||||
expected = {'least_favourite_game': [], 'favourite_game': [],
|
||||
'friends': ['favourite_game', 'least_favourite_game']}
|
||||
given = [
|
||||
"friends__least_favourite_game",
|
||||
"least_favourite_game",
|
||||
"friends",
|
||||
"favourite_game",
|
||||
"friends__favourite_game",
|
||||
]
|
||||
expected = {
|
||||
"least_favourite_game": [],
|
||||
"favourite_game": [],
|
||||
"friends": ["favourite_game", "least_favourite_game"],
|
||||
}
|
||||
assert group_related_list(given) == expected
|
||||
|
||||
@ -101,15 +101,10 @@ async def test_model_multiple_instances_of_same_table_in_schema():
|
||||
async with database:
|
||||
await create_data()
|
||||
classes = await SchoolClass.objects.select_related(
|
||||
["teachers__category__department", "students"]
|
||||
["teachers__category__department", "students__category__department"]
|
||||
).all()
|
||||
assert classes[0].name == "Math"
|
||||
assert classes[0].students[0].name == "Jane"
|
||||
assert len(classes[0].dict().get("students")) == 2
|
||||
assert classes[0].teachers[0].category.department.name == "Law Department"
|
||||
|
||||
assert classes[0].students[0].category.pk is not None
|
||||
assert classes[0].students[0].category.name is None
|
||||
await classes[0].students[0].category.load()
|
||||
await classes[0].students[0].category.department.load()
|
||||
assert classes[0].students[0].category.department.name == "Math Department"
|
||||
|
||||
Reference in New Issue
Block a user