Slicing QuerySet Result Objects by SepehrBazyar · Pull Request #765 · ormar-orm/ormar

Expand Up @@ -120,3 +120,79 @@ async def test_proxy_pagination(): await user.cars.paginate(2, page_size=10).all() assert len(user.cars) == 10 assert user.cars[0].name == "10"

@pytest.mark.asyncio async def test_slice_getitem_queryset_exceptions(): async with database: async with database.transaction(force_rollback=True): with pytest.raises(TypeError): await Car.objects["foo"].all()
with pytest.raises(ValueError): await Car.objects[-1].all()
with pytest.raises(ValueError): await Car.objects[::2].all()
with pytest.raises(ValueError): await Car.objects[-2:-1].all()

@pytest.mark.asyncio async def test_slice_getitem_queryset_on_single_model(): async with database: async with database.transaction(force_rollback=True): for i in range(10): await Car(name=f"{i}").save()
cars_page1 = await Car.objects[2:8].all() assert len(cars_page1) == 6 assert cars_page1[0].name == "2" assert cars_page1[-1].name == "7"
cars_page2 = await Car.objects[2:].all() assert len(cars_page2) == 8 assert cars_page2[0].name == "2" assert cars_page2[-1].name == "9"
cars_page3 = await Car.objects[:8].all() assert len(cars_page3) == 8 assert cars_page3[0].name == "0" assert cars_page3[-1].name == "7"
cars_page4 = await Car.objects[5].all() assert len(cars_page4) == 1 assert cars_page4[0].name == "5"
cars_page5 = await Car.objects[8:2].all() assert len(cars_page5) == 0 assert cars_page5 == []

@pytest.mark.asyncio async def test_slice_getitem_queryset_on_proxy(): async with database: async with database.transaction(force_rollback=True): user = await User(name="Sep").save()
for i in range(20): c = await Car(name=f"{i}").save() await user.cars.add(c)
await user.cars.filter(id__gte=0)[:5].all() assert len(user.cars) == 5 assert user.cars[0].name == "0" assert user.cars[4].name == "4"
await user.cars.filter(id__gte=0)[5:10].all() assert len(user.cars) == 5 assert user.cars[0].name == "5" assert user.cars[4].name == "9"
await user.cars.filter(id__gte=0)[10].all() assert len(user.cars) == 1
await user.cars.filter(id__gte=0)[10:].all() assert len(user.cars) == 10 assert user.cars[0].name == "10"