向请求添加新字段和值 - Django - Django Rest Framework (viewset, serializer)
Add new field and value to the request - Django - Django Rest Framework (viewset, serializer)
我在 django-rest-framework 中有一个端点并接收一个对象 name 和 date.
在保存我的数据库之前,我需要在对象中包含 user (fk_model_user),如何在正文请求中保存或更新包含新项目?
- 视图集:
class MusicStylesViewSet(
mixins.ListModelMixin,
mixins.CreateModelMixin,
mixins.UpdateModelMixin,
mixins.DestroyModelMixin,
mixins.RetrieveModelMixin,
viewsets.GenericViewSet
):
permission_classes = [permissions.AllowAny]
queryset = MusicStyleModel.objects.all()
serializer_class = StyleSerializer
- 序列化器:
class StyleSerializer(ModelSerializer):
class Meta:
model = MusicStyleModel
fields = ('id', 'name', 'date', 'user')
- 型号:
class MusicStyleModel(models.Model):
id = models.UUIDField(primary_key=True, unique=True, default=uuid.uuid4, editable=False, null=False)
name = models.CharField(max_length=150, null=False, blank=False)
date = models.DateTimeField(null=False, blank=False)
user = models.ForeignKey(
CustomUser,
null=True,
blank=False,
on_delete=models.CASCADE
)
示例 - Post 请求:
{
"name": "test",
"date": "2021-05-14T15:47:06.794639-03:00"
}
示例 - Post 响应:
{
"id": "810ae929-2f6d-411a-8d10-77c8f613a8ac",
"name": "test",
"date": "2021-05-14T15:47:06.794639-03:00",
"user": "c6fbbfee-2f16-49f3-b4cd-b99e05a66ea8"
}
"id": "810ae929-2f6d-411a-8d10-77c8f613a8ac", automatically generated in the model
"user": "c6fbbfee-2f16-49f3-b4cd-b99e05a66ea8" user id request intercepted, and save
如果您要使用所有这些混入,最好使用 ModelViewSet'
from rest_framework import viewsets
class MusicStylesViewSet(
mixins.ListModelMixin,
mixins.CreateModelMixin,
mixins.UpdateModelMixin,
mixins.DestroyModelMixin,
mixins.RetrieveModelMixin,
viewsets.GenericViewSet
):
permission_classes = [permissions.AllowAny]
queryset = MusicStyleModel.objects.all()
serializer_class = StyleSerializer
def post(self, request, *args, **kwargs):
serializer = StyleSerializer(request.data)
if serializer.is_valid():
serializer.validated_data['user'] = request.user
serializer.save()
return self.create(request, *args, **kwargs)
我设法使用 create 解决了问题:
from rest_framework import viewsets, status
from rest_framework.response import Response
class MusicStylesViewSet(
mixins.ListModelMixin,
mixins.CreateModelMixin,
mixins.UpdateModelMixin,
mixins.DestroyModelMixin,
mixins.RetrieveModelMixin,
viewsets.GenericViewSet
):
permission_classes = [permissions.AllowAny]
queryset = MusicStyleModel.objects.all()
serializer_class = StyleSerializer
def create(self, request, *args, **kwargs):
serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True)
data = serializer.validated_data
data['user'] = request.user
self.perform_create(serializer)
headers = self.get_success_headers(serializer.data)
return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)
我在 django-rest-framework 中有一个端点并接收一个对象 name 和 date.
在保存我的数据库之前,我需要在对象中包含 user (fk_model_user),如何在正文请求中保存或更新包含新项目?
- 视图集:
class MusicStylesViewSet(
mixins.ListModelMixin,
mixins.CreateModelMixin,
mixins.UpdateModelMixin,
mixins.DestroyModelMixin,
mixins.RetrieveModelMixin,
viewsets.GenericViewSet
):
permission_classes = [permissions.AllowAny]
queryset = MusicStyleModel.objects.all()
serializer_class = StyleSerializer
- 序列化器:
class StyleSerializer(ModelSerializer):
class Meta:
model = MusicStyleModel
fields = ('id', 'name', 'date', 'user')
- 型号:
class MusicStyleModel(models.Model):
id = models.UUIDField(primary_key=True, unique=True, default=uuid.uuid4, editable=False, null=False)
name = models.CharField(max_length=150, null=False, blank=False)
date = models.DateTimeField(null=False, blank=False)
user = models.ForeignKey(
CustomUser,
null=True,
blank=False,
on_delete=models.CASCADE
)
示例 - Post 请求:
{
"name": "test",
"date": "2021-05-14T15:47:06.794639-03:00"
}
示例 - Post 响应:
{
"id": "810ae929-2f6d-411a-8d10-77c8f613a8ac",
"name": "test",
"date": "2021-05-14T15:47:06.794639-03:00",
"user": "c6fbbfee-2f16-49f3-b4cd-b99e05a66ea8"
}
"id": "810ae929-2f6d-411a-8d10-77c8f613a8ac", automatically generated in the model
"user": "c6fbbfee-2f16-49f3-b4cd-b99e05a66ea8" user id request intercepted, and save
如果您要使用所有这些混入,最好使用 ModelViewSet'
from rest_framework import viewsets
class MusicStylesViewSet(
mixins.ListModelMixin,
mixins.CreateModelMixin,
mixins.UpdateModelMixin,
mixins.DestroyModelMixin,
mixins.RetrieveModelMixin,
viewsets.GenericViewSet
):
permission_classes = [permissions.AllowAny]
queryset = MusicStyleModel.objects.all()
serializer_class = StyleSerializer
def post(self, request, *args, **kwargs):
serializer = StyleSerializer(request.data)
if serializer.is_valid():
serializer.validated_data['user'] = request.user
serializer.save()
return self.create(request, *args, **kwargs)
我设法使用 create 解决了问题:
from rest_framework import viewsets, status
from rest_framework.response import Response
class MusicStylesViewSet(
mixins.ListModelMixin,
mixins.CreateModelMixin,
mixins.UpdateModelMixin,
mixins.DestroyModelMixin,
mixins.RetrieveModelMixin,
viewsets.GenericViewSet
):
permission_classes = [permissions.AllowAny]
queryset = MusicStyleModel.objects.all()
serializer_class = StyleSerializer
def create(self, request, *args, **kwargs):
serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True)
data = serializer.validated_data
data['user'] = request.user
self.perform_create(serializer)
headers = self.get_success_headers(serializer.data)
return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)