0

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..

Pradip Kachhadiya
  • 2,067
  • 10
  • 28

2 Answers2

1

i really do not understand your question but if you intend to store json data in your model field, then you could try...

in your model:

import json

@property
def user_rate_details(self):
     return json.loads(self.user_rate_details)

in your view:

pk = request.data.get('photo_id')
rate = request.data.get('rate')
photo = self.get_userPhoto(pk)
details = photo.user_rate_detail
details['rate'] = int(rate)
photo.user_rate_details = json.dumps(details)
photo.save(update_fields=['user_rate_details'])
return Response()
Chymdy
  • 662
  • 4
  • 14
0

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)
Pradip Kachhadiya
  • 2,067
  • 10
  • 28