Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在django中发送post请求的查询_Django_Python 3.x_Django Models_Django Rest Framework_Django Views - Fatal编程技术网

在django中发送post请求的查询

在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": [{

我正在尝试创建一个卡路里信息API,它可以为用户节省卡路里摄入量

  • 如果是新用户,则为用户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)