An API backend for an application with entity relation table.
Country
| key | Data type | Description | 
|---|---|---|
| id | Primary Key | |
| Name | Character Field | Name of the country | 
| Description | Text Field | Description of country | 
| Population | Integer Field | |
| GDP | Float Field | 
State
| key | Data type | Description | 
|---|---|---|
| id | Primary Key | |
| Country | Foreign Key | Relation to country | 
| Name | Character Field | Name of the state | 
| Description | Text Field | Description of state | 
| Population | Integer Field | |
| GDP | Float Field | 
City
| key | Data type | Description | 
|---|---|---|
| id | Primary Key | |
| State | Foreign Key | Relation to State | 
| Country | Foreign Key | Relation to Country | 
| Name | Character Field | Name of the city | 
| Description | Text Field | Description of city | 
| Population | Integer Field | |
| GDP | Float Field | |
| Pin Code | Character Field | 
Town
| key | Data type | Description | 
|---|---|---|
| id | Primary Key | |
| State | Foreign Key | Relation to State | 
| Country | Foreign Key | Relation to Country | 
| Name | Character Field | Name of the Town | 
| Description | Text Field | Description of Town | 
| Population | Integer Field | |
| GDP | Float Field | |
| Pin Code | Character Field | 
Person
| key | Data type | Description | 
|---|---|---|
| id | Primary Key | |
| Name | Character Field | Name of the Person | 
| State | Foreign Key | Relation to State | 
| Country | Foreign Key | Relation to Country | 
| City | Foreign Key | Relation to city | 
| Town | Foreign Key | Relation to town | 
- Initial Setup
- Clone this repository : https://github.com/the-arcade-01/DRF-API.git
- Install Requirements : pip install -r requirements.txt
- Backend Setup
- cd to Backend and run following sets of commands
- python manage.py makemigrations
- python manage.py migrate
 
- Create super user by python manage.py createsuperuser
 NOTE: API required Basic Authentication, creating superuser is must
API url set
admin/
country-viewset/
country-viewset/<int:id>/
state-viewset/
state-viewset/<int:id>/
city-viewset/
city-viewset/<int:id>/
town-viewset/
town-viewset/<int:id>/
person-viewset/
person-viewset/<int:id>/
- Country Viewset URLs:
- For entire data with Pagination http://127.0.0.1:8000/country-viewset/
- For individual data http://127.0.0.1:8000/country-viewset/<int:id>/
Response examples:
HTTP 200 OK
Allow: GET, POST, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept
{
    "count": 3,
    "next": "http://127.0.0.1:8000/country-viewset/api/?page=2",
    "previous": null,
    "results": [
        {
            "id": 8,
            "name": "India",
            "description": "India is a diverse country",
            "population": 1300,
            "gdp": 3.202,
            "state_country": [
                {
                    "id": 12,
                    "country": 8,
                    "name": "Madhya Pradesh",
                    "description": "Central state of India",
                    "population": 45,
                    "gdp": 0.002,
                    "city_state": [
                        {
                            "id": 6,
                            "country": 8,
                            "state": 12,
                            "name": "Bhopal",
                            "description": "City of Lakes",
                            "population": 20,
                            "gdp": 0.00134,
                            "pin_code": "400001",
                            "person_city": [
                                {
                                    "id": 6,
                                    "name": "Anish",
                                    "country": 8,
                                    "state": 12,
                                    "city": 6,
                                    "town": 4
                                }
                            ]
                        }
                    ],
                    "town_state": [
                        {
                            "id": 4,
                            "country": 8,
                            "state": 12,
                            "name": "GandhiNagar",
                            "description": "Town in MP",
                            "population": 5,
                            "gdp": 0.00015,
                            "pin_code": "400101",
                            "person_town": [
                                {
                                    "id": 6,
                                    "name": "Anish",
                                    "country": 8,
                                    "state": 12,
                                    "city": 6,
                                    "town": 4
                                }
                            ]
                        }
                    ]
                },
                {
                    "id": 11,
                    "country": 8,
                    "name": "Maharashtra",
                    "description": "Jai Maharashtra!!",
                    "population": 123,
                    "gdp": 0.0034,
                    "city_state": [],
                    "town_state": []
                }
            ]
        }
    ]
}- Person Viewset URLs:
- For entire data with Pagination http://127.0.0.1:8000/person-viewset/
- For individual data http://127.0.0.1:8000/person-viewset/<int:id>/
Response examples:
- Url : /person-viewset/api/?page=2
HTTP 200 OK
Allow: GET, POST, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept
{
    "count": 4,
    "next": "http://127.0.0.1:8000/person-viewset/api/?page=3",
    "previous": "http://127.0.0.1:8000/person-viewset/api/",
    "results": [
        {
            "id": 6,
            "name": "Anish",
            "country": 8,
            "state": 12,
            "city": 6,
            "town": 4
        }
    ]
}- Ordering and Search Filter Response : /person-viewset/api/?ordering=name&search=India
Ordering on Person Name and Search Filter on Country Name
HTTP 200 OK
Allow: GET, POST, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept
{
    "count": 2,
    "next": "http://127.0.0.1:8000/person-viewset/api/?ordering=name&page=2&search=India",
    "previous": null,
    "results": [
        {
            "id": 6,
            "name": "Anish",
            "country": 8,
            "state": 12,
            "city": 6,
            "town": 4
        }
    ]
}Postman Collections can be found Here
- API for Country, City, Town, State and Person
- CRUD for all
- ModelSerializer with Nested serializer
- Person relation with City and Town
- Pagination API for all
- Filter, Ordering and Searching for Person based on related keys
- selected_related() for speeding queries
- Postman Collections for all API
- Implemented views using ModelViewSet
- Comments and modular code