Bishwas-py / djapy

No bullshit, Django Rest API Framework
https://djapy.io
61 stars 3 forks source link

In path params hamper the object level, and converts the objects into dict, rather than objects. #11

Closed Bishwas-py closed 6 months ago

Bishwas-py commented 7 months ago
path('<int:todo_id>/update', views.update_todo_item, name='update-todo-item'),

class TodoItemUpdateSchema(Schema):
    title: Optional[str] = None
    description: Optional[str] = None
    will_be_completed_at: Optional[datetime] = None
    completed_at: Optional[datetime] = None

@djapify(allowed_method="PUT")
@djapy_auth(AUTH_MECHANISM, permissions=["todo.change_todoitem"])
def update_todo_item(request, todo_id: int, data: TodoItemUpdateSchema) -> TodoItemSchema:
    todo_item = TodoItem.objects.get(id=todo_id)
    if data.title:
        todo_item.title = data.title
    if data.description:
        todo_item.description = data.description
    if data.completed_at:
        todo_item.completed_at = data.completed_at
    if data.will_be_completed_at:
        todo_item.will_be_completed_at = data.will_be_completed_at
    todo_item.save()
    return todo_item

In this situation, todo_id works well, but data gets accepted only with a second level child:

"data": {
   "title": "XYZ"
    ...
}

Also, data acts as dict rather than object after being parsed. data.title is not possible, but data['title'] is.

# this is the input parsed:
{'title': 'Django testing #2', 'description': None, 'will_be_completed_at': datetime.datetime(2024, 3, 11, 23, 17, tzinfo=TzInfo(UTC)), 'completed_at': datetime.datetime(2024, 3, 2, 5, 35, tzinfo=TzInfo(UTC))}
Bishwas-py commented 6 months ago

ee8d8fd499757e9e6180145ad6190e202baec374 has fixed the issue.