code_nation
code_nation

Reputation: 103

Query to send post request in django

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

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 ?

Upvotes: 2

Views: 84

Answers (2)

Meha Parekh
Meha Parekh

Reputation: 322

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)

Upvotes: 1

Muhammad Hassan
Muhammad Hassan

Reputation: 14391

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)

Upvotes: 0

Related Questions