0

i have a endpoint in django-rest-framework and receive a object name and date.

I need include user (fk_model_user) in object before save my database, how save or update including new item in body request?

  • Viewset:
    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
  • Serializer:
    class StyleSerializer(ModelSerializer):
        class Meta:
            model = MusicStyleModel
            fields = ('id', 'name', 'date', 'user')
  • Model:
    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
        )

Example - Post Request:

    {
        "name": "test",
        "date": "2021-05-14T15:47:06.794639-03:00"
    }

Example - Post Response:

    {
        "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

maistack123
  • 135
  • 10
  • maybe this, https://stackoverflow.com/questions/35518273/how-to-set-current-user-to-user-field-in-django-rest-framework – JPG May 18 '21 at 16:25
  • you can overwrite create method in your serialzier or post method in your viewset (APIView). based upon what exactly you want user to be. – ItsMilann May 18 '21 at 16:35
  • @ItsMilann What is the best practice for doing this? – maistack123 May 18 '21 at 16:42
  • i dont see much difference, except serializers dont have access to request object directly so I would suggest to create it in apiview – ItsMilann May 18 '21 at 16:44
  • @ItsMilann To create ApiView, do I need to modify my current apiview? Can you demonstrate how I would do this in the 'apiview' and 'serializer'? – maistack123 May 18 '21 at 16:47
  • so do you want user field to be null or any other specific user? – ItsMilann May 18 '21 at 16:54
  • @ItsMilann In the request the field is null, but "viewset" or "serializer" set user_id value in user field when to save or update. – maistack123 May 18 '21 at 17:16

2 Answers2

1

if you're going to use all these mixins better use 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)
ItsMilann
  • 395
  • 3
  • 12
1

I managed to solve using 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)
maistack123
  • 135
  • 10