Search code examples
djangodjango-modelsdjango-rest-frameworkdjango-viewsdjango-jsonfield

How to Create ,Get and update JSON data in Django model Text field?


I seen many answer related this problem but I confused how to implement this.

My requirement is:

(Create)First create data with key and value: {"pradip" : 80} and store in user_rate_details model field.

(Update)Second time append new data in this field : {"pradip" : 80,"exz" : 70} and save it. How to achieve this in my views..

models.py:

    class UserPhoto(models.Model):
        user = models.ForeignKey(to = User,on_delete = models.CASCADE,related_name='userPhoto')
        ......
        rated_by = models.ManyToManyField(Profile,blank=True,related_name='rate_by')
        user_rate_details = models.TextField()  ⬅⬅⬅⬅⬅ Here store JSON data
        created_date = models.DateTimeField(auto_now_add=True)

views.py:

    class PhotoRate(APIView):
        permission_classes = [IsAuthenticated]
        
        def get_userPhoto(self,pk):
            try:
                return UserPhoto.objects.get(id = pk)
            except UserPhoto.DoesNotExist:
                raise Http404
        
        def post(self,request,formate = None):
            pk = request.data.get('photo_id')
            rate = request.data.get('rate')
            photo = self.get_userPhoto(pk)
            ???????? How to create or update Json data here???
            return Response(??JSON DATA??)

Any other best way you know please tell me..

Thank you..


Solution

  • Create Text field in model and dump or load JSON data..

    models.py:

        import json
        class UserPhoto(models.Model):
            user = models.ForeignKey(to = User,on_delete = models.CASCADE,related_name='userPhoto')
            ......
            rated_by = models.ManyToManyField(Profile,blank=True,related_name='rate_by')
            user_rate_details = models.TextField(default="{}")
            created_date = models.DateTimeField(auto_now_add=True)
        
            @property
            def rate_details(self):
                return json.loads(self.user_rate_details)

    views.py:

    class PhotoRate(APIView):
        permission_classes = [IsAuthenticated]
        
        def get_userPhoto(self,pk):
            try:
                return UserPhoto.objects.get(id = pk)
            except UserPhoto.DoesNotExist:
                raise Http404
        
        def post(self,request,formate = None):
            pk = request.data.get('photo_id')
            rate = request.data.get('rate')
            photo = self.get_userPhoto(pk)
            user_dict = photo.rate_details
            user_dict[self.request.user.username] = int(rate)
            photo.user_rate_details = json.dumps(user_dict)
            photo.save(update_fields=['user_rate_details'])
            return Response({"Success" : "Rate submited!!"},status=status.HTTP_200_OK)
    
        def patch(self,request,formate=None):
            pk = request.data.get('photo_id')
            photo = self.get_userPhoto(pk)
            rate_detail = photo.rate_details
            return Response({"Rated Users" : rate_detail},status=status.HTTP_200_OK)