Query to send post request in django

Viewed 82

I'm trying to create a Calorie Info API which saves calorie intake for a user.

  • If it is a new user, then add an entry for the user id and item id.
  • If the user already exists,

    • If the item is new, then just map the item id and the calorie count with that user.
    • If the item id is already mapped with that user, then add the items calorie count with that item for that user.

      Url: /api/calorie-info/save/
      Method: POST,
      Input: 
           {
               "user_id": 1,
               "calorie_info": [{
                      "itemId": 10,
                      "calorie_count": 100
               }, {
                "itemId": 11,
                "calorie_count": 100
               }]
           }
      
      Output: 
         - Response Code: 201
      

My model:

class CalorieInfo(models.Model):
    user_id = models.IntegerField(unique=True)
    itemId = models.IntegerField(unique=True)
    calorie_count = models.IntegerField()

I tried:

class Calorie(APIView):

    def post(self, request):

        data = json.loads(request.body.decode("utf-8"))
        user_id = data['user_id']

        for i in data['calorie_info']:
            entry = CalorieInfo(user_id=user_id, item_id=i['itemId'], calorie=i['calorie_count'])
            entry.save()

        res = {"status": "success"}
        return Response(res, status=status.HTTP_201_CREATED)

The above code works fine but how can I check the above conditions in my code ?

2 Answers

you need to check like this:

def post(self, request):

    data = json.loads(request.body.decode("utf-8"))
    user_id = data['user_id']

    # fetch calorieinfo object for given user
    user_calorieinfo = CalorieInfo.objects.filter(user_id=user_id)
    # if user exists
    if user_calorieinfo:
        # ifCalorieInfo item mapped with user
        for i in data['calorie_info']:
            if CalorieInfo.objects.filter(user_id=user_id,itemId=i['itemId']:
               for obj in CalorieInfo.objects.filter(user_id=user_id,itemId=i['itemId']):
                   updated_count = obj.calorie_count + i['calorie_count'] 
               CalorieInfo.objects.filter(user_id=user_id,itemId=i['itemId']).update(calorie_count= updated_count)            
            else:
                entry = CalorieInfo(user_id=user_id, item_id=i['itemId'], calorie=i['calorie_count'])
                entry.save()
    else:
        for i in data['calorie_info']:
            entry = CalorieInfo(user_id=user_id, item_id=i['itemId'], calorie=i['calorie_count'])
            entry.save()

    res = {"status": "success"}
    return Response(res, status=status.HTTP_201_CREATED)

Hope this will work!

#for getting CalorieInfo object
def get(self):
    id = request.GET.get('user_id')
    user_calorieinfo = CalorieInfo.objects.filter(user_id=user_id)
    response["user_id"] = id
    response["calorie_info"] = []
    for obj in user_calorieinfo:
        response["calorie_info"].append({"itemId":obj.itemID, "calorie_count":obj.calorie_count})
    response["status"] = success
    return Response(response, status=status.HTTP_200_OK)

If user and item are representing an entity then you should have separate table for this. Those table should be used as foreign key in this table.

For user, Django already have auth.User model. So you do not have to create a seperate table for this

For item, you can define a table like this

class Item(models.Model):
    name = models.CharField(max_length=100)

Your table will become like this

class CalorieInfo(models.Model):
    user = models.ForeignKey(to='auth.User')
    item = models.ForeignKey(to='Item')
    calorie_count = models.IntegerField()

No need to write foreign keys like user_id or item_id as Django do it automatically to the foreign key. When will user foreign keys, Django will make sure if these objects which are referred with foreign keys already exist in database.

Your view will look like this

class CalorieView(APIView):

    def post(self, request):

        data = request.data
        for ci in data.get('calorie_info', []):
            clinfo, created = CalorieInfo.objects.update_or_create(
                user_id=data.get('user_id'),
                item=ci.get('itemId'),
                defaults={'calorie_count': ci.get('calorie_count')
            )
        return Response(
              {"status": "success"}, status=status.HTTP_201_CREATED)
Related