在django中发送post请求的查询
我正在尝试创建一个卡路里信息API,它可以为用户节省卡路里摄入量在django中发送post请求的查询,django,python-3.x,django-models,django-rest-framework,django-views,Django,Python 3.x,Django Models,Django Rest Framework,Django Views,我正在尝试创建一个卡路里信息API,它可以为用户节省卡路里摄入量 如果是新用户,则为用户id和项目id添加一个条目 如果用户已经存在 如果项目是新的,那么只需与该用户映射项目id和卡路里计数 如果项目id已映射到该用户,则将该用户的项目卡路里计数添加到该项目中 Url: /api/calorie-info/save/ Method: POST, Input: { "user_id": 1, "calorie_info": [{
- 如果是新用户,则为用户id和项目id添加一个条目
- 如果用户已经存在
- 如果项目是新的,那么只需与该用户映射项目id和卡路里计数李>
- 如果项目id已映射到该用户,则将该用户的项目卡路里计数添加到该项目中
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
class CalorieInfo(models.Model):
user_id = models.IntegerField(unique=True)
itemId = models.IntegerField(unique=True)
calorie_count = models.IntegerField()
我试过:
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)
上述代码工作正常,但如何在代码中检查上述条件?您需要这样检查:
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)
希望这能奏效
#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)
若用户和项目代表一个实体,那个么您应该对此有单独的表。这些表应用作此表中的外键 对于用户,Django已经有了
auth.user
model。因此,您不必为此创建单独的表
对于项,可以定义如下表
class Item(models.Model):
name = models.CharField(max_length=100)
class CalorieInfo(models.Model):
user = models.ForeignKey(to='auth.User')
item = models.ForeignKey(to='Item')
calorie_count = models.IntegerField()
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)
你的桌子会变成这样
class Item(models.Model):
name = models.CharField(max_length=100)
class CalorieInfo(models.Model):
user = models.ForeignKey(to='auth.User')
item = models.ForeignKey(to='Item')
calorie_count = models.IntegerField()
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)
不需要像Django自动写入外键那样写入外键,如user\u id
或item\u id
。当使用外键时,Django将确保数据库中是否已经存在这些用外键引用的对象
您的视图将如下所示
class Item(models.Model):
name = models.CharField(max_length=100)
class CalorieInfo(models.Model):
user = models.ForeignKey(to='auth.User')
item = models.ForeignKey(to='Item')
calorie_count = models.IntegerField()
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)
评论不用于扩展讨论;此对话已被删除。@code\u nation刚刚删除了更新答案中的循环!如果我试图获取id的数据,比如说1,并且我以相同的方式得到响应,那么您知道如何以类似的方式获取数据吗@MehaParekhyes,您可以传递它的id和filter对象,您需要设置一个dict,因为默认情况下它不会像您期望的那样返回!如果你愿意,我可以把它添加到答案中@请输入国家代码,非常感谢。上面的代码无法添加任何其他itemId。它第一次工作时非常完美,但如果我更改ID并再次发送,它将无法工作@MEHAPAREKH对于特定id(比如user_id=1)获取相同格式数据的查询是什么@Muhammad Hassan
caloriinfo.objects.filter(用户id=1)