Как получить и отправить данные (сериализовать) желаемым образом (в обоих направлениях), используя react & django-rest-framework

Я работаю над проектом, где API на основе django-framework работает как сервер, фронт создан с помощью react/redux.

Моя проблема в том, что я написал несколько сериализаторов для Django Users & Project. При получении проекта или проектов я получаю json в формате:

{
"project_leader": 
{
    "id": user_id,
    "last_login": ...,
    "username": ...,
    "first_name": ...,
    "last_name": ...,
 }
"project_name": string,
"project_description": string,
"done": boolean,
"due_date": time
}

данные project_leader(User) имеют тот же формат, что и в сериализаторе ниже. Формат данных, который я хочу получить, хороший, но проблема начинается, когда я пытаюсь создать новый.

  1. When i format the data in react component in a way like in serializer - i receive errors like: Cannot parse keyword query as dict
  2. When i format the data in a "django-way" - for example a user is only a user id, not the whole dictionary - the project is created but i what i receive back in a user field is just a user id, so i cannot dispatch action to the reducer because i don't have all the user data i map.

Модели:

class Project(models.Model):
    project_leader = models.ForeignKey(User, on_delete=models.CASCADE)
    project_name = models.CharField(max_length=128)
    project_description = models.TextField()
    done = models.BooleanField(default=False)
    due_date = models.DateField()

Сериализаторы:

class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = [
            'id', 'last_login', 'is_superuser', 'username', 'first_name',
            'last_name', 'email', 'date_joined', 'groups'
        ]

class ProjectSerializer(serializers.ModelSerializer):
    project_leader = UserSerializer()


class Meta:
    model = Project
    fields = [
        'id',  'project_description', 'done', 'due_date', 
        'project_leader'
    ]

Просмотров:

class ProjectAPIView(APIView):

def get(self, request, project_id=None):
    if project_id is not None:
        project = Project.objects.get(id=project_id)
        serializer = ProjectSerializer(project)
    else:
        projects = Project.objects.all()
        serializer = ProjectSerializer(projects, many=True)
    return Response(serializer.data)

def post(self, request):
    serializer = ProjectSerializer(data=request.data)
    if serializer.is_valid():
        serializer.save()
        return Response(serializer.data, status=status.HTTP_201_CREATED)
    return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

Действие отправки:

export const addTask = (task) => dispatch => {
axios.post(`http://127.0.0.1:8000/api/projects/`, task)
    .then((res) => {
        dispatch({
            type: ADD_TASK,
            payload: res.data
        })
    })
    .catch((err) => {
        dispatch({
            type: SET_ERRORS,
            payload: err.response.data
        })
    })

}

Reducer:

case ADD_TASK:
return {
    ...state,
    tasks: [
        action.payload,
        ...state.tasks,
    ]
}

Честно говоря - я хочу отправить данные в одном формате, когда объект создан, я хочу получить данные обратно в качестве ответа в другом формате.

Есть идеи, как решить эту проблему? Заранее спасибо.

Вернуться на верх