Как получить и отправить данные (сериализовать) желаемым образом (в обоих направлениях), используя 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) имеют тот же формат, что и в сериализаторе ниже. Формат данных, который я хочу получить, хороший, но проблема начинается, когда я пытаюсь создать новый.
- When i format the data in react component in a way like in serializer - i receive errors like:
Cannot parse keyword query as dict
- 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,
]
}
Честно говоря - я хочу отправить данные в одном формате, когда объект создан, я хочу получить данные обратно в качестве ответа в другом формате.
Есть идеи, как решить эту проблему? Заранее спасибо.