Reputation: 103
I'm trying to create a Calorie Info API which saves calorie intake for a user.
If the user already exists,
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 ?
Upvotes: 2
Views: 84
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
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