Запрос на отправку почтового запроса в django - PullRequest
2 голосов
/ 12 марта 2020

Я пытаюсь создать информационный API Calor ie, который экономит потребление калорий ie для пользователя.

  • Если это новый пользователь, добавьте запись для идентификатора пользователя и идентификатора элемента.
  • Если пользователь уже существует,

    • Если элемент новый, просто сопоставьте идентификатор элемента и количество калорий ie с этим пользователем.
    • Если идентификатор элемента уже сопоставлен с этим пользователем, добавьте калорийность элементов ie с этим элементом для этого пользователя.

      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)

Приведенный выше код работает нормально, но как я могу проверить вышеуказанные условия в моем коде?

Ответы [ 2 ]

1 голос
/ 12 марта 2020

вам нужно проверить вот так:

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)
0 голосов
/ 12 марта 2020

Если пользователь и элемент представляют сущность, то для этого у вас должна быть отдельная таблица. Эти таблицы должны использоваться в качестве внешнего ключа в этой таблице.

Для пользователя Django уже имеет auth.User модель. Таким образом, вам не нужно создавать отдельную таблицу для этого

Для элемента вы можете определить таблицу следующим образом

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()

Нет необходимости записывать внешние ключи, такие как user_id или item_id, так как Django делает это автоматически для внешнего ключа. Когда пользователь будет использовать внешние ключи, Django проверит, существуют ли эти объекты, на которые ссылаются внешние ключи, уже в базе данных.

Ваш взгляд будет выглядеть так

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)
...