# TaskCollectionResponse

Task collection serializer for responses.

## Properties

Name | Type | Description | Notes
------------ | ------------- | ------------- | -------------
**tasks** | [**List[TaskResponse]**](TaskResponse.md) |  | 
**total_entries** | **int** |  | 

## Example

```python
from airflow_client.client.models.task_collection_response import TaskCollectionResponse

# TODO update the JSON string below
json = "{}"
# create an instance of TaskCollectionResponse from a JSON string
task_collection_response_instance = TaskCollectionResponse.from_json(json)
# print the JSON string representation of the object
print(TaskCollectionResponse.to_json())

# convert the object into a dict
task_collection_response_dict = task_collection_response_instance.to_dict()
# create an instance of TaskCollectionResponse from a dict
task_collection_response_from_dict = TaskCollectionResponse.from_dict(task_collection_response_dict)
```
[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)


