Запрос POST Django через ajax?

Я пытаюсь отправить значения через ajax на серверную часть django, но я продолжаю получать эту ошибку Advice matching query does not exist, но она существует в базе данных. Я не знаю, что делаю не так. Вот мой фрагмент кода для запроса AJAX:

$.ajax({
    type: 'POST',
    url: '{% url "recsystem:saveData" %}',
    data: {
        'csrfmiddlewaretoken' : "{{  csrf_token  }}",
        'ansId' : data.ansId,
        'queTitle': data.queTitle,
        'queText' : data.queText,
        'desc': data.desc,
        'optionType': data.optionType,
        'anstextArray': data.anstextArray,
        'ansAdvicesArray': data.ansAdvicesArray
     },
     success: function(data){
         console.info(data);
     },
     error: function(error){
         console.info(error);
     }
});

Вот моя функция в представлении Django для сохранения этих данных.

def saveData(request):

if request.method =='POST' and request.is_ajax():    
    q = Question()
    q.question_title = request.POST['queTitle']
    q.question_text = request.POST['queText']
    q.description = request.POST['desc']
    q.options_type = request.POST['optionType']
    q.save()

    if not request.POST['ansId'] is None:
        followup = FollowUp()
        followup.description = ""
        followup.answer = Answer.objects.get(pk=request.POST['ansId'])
        followup.question = q
        followup.save()

    if not request.POST.get('anstextArray', False) is None:
        answers = []
        advices = []
        answers = request.POST.get('anstextArray', False)
        advices = request.POST.get('ansAdvicesArray', False)
        for an, ad in zip(itertools.repeat(answers), itertools.repeat(advices)):
            adviceList = []
            adviceList = ad
            answer = Answer()
            answer.question = q
            answer.answer_text = an

            for id in itertools.repeat(adviceList):
                answer.advice = Advice.objects.get(pk=id)

            answer.save()

    return JsonResponse({'result':'ok'})

else:
    return JsonResponse({'result':'nok'})

Вот моя модель базы данных:

class Question(models.Model):
  question_title = models.CharField(max_length = 250)
  question_text = models.TextField(max_length = 3000)
  description = models.TextField(max_length = 3000)
  options_type = models.CharField(max_length = 250)

  def __str__(self):
         return self.question_title

class Advice(models.Model):
  advice_label = models.TextField(max_length = 2000)
  advice_text = models.TextField(max_length = 3000)
  time_stamp = models.TextField( default=timezone.now, max_length= 2000)


  def __str__(self):
        return self.advice_label


class Answer(models.Model):
  question = models.ForeignKey(Question, on_delete=models.CASCADE)
  answer_text = models.CharField(max_length = 250)
  advices = models.ManyToManyField(Advice)
  def __str__(self):
         return self.answer_text


class FollowUp(models.Model):
  description = models.CharField(max_length = 250)
  answer = models.ForeignKey(Answer, on_delete=models.CASCADE)
  question = models.ForeignKey(Question, on_delete=models.CASCADE)

Проблема кроется где-то там, где я пытаюсь сохранить массивы в виде списков, а затем перебираю их.

Traceback: 

File "C:\Users\habib\AppData\Local\Programs\Python\Python36-32\lib\site- 
packages\django\core\handlers\exception.py" in inner
41.             response = get_response(request)

File "C:\Users\habib\AppData\Local\Programs\Python\Python36-32\lib\site- 
packages\django\core\handlers\base.py" in _get_response
187.                 response = self.process_exception_by_middleware(e, 
request)

File "C:\Users\habib\AppData\Local\Programs\Python\Python36-32\lib\site- 
packages\django\core\handlers\base.py" in _get_response
185.                 response = wrapped_callback(request, *callback_args, 
**callback_kwargs)

File "C:\Users\habib\Desktop\recommender\src\recsystem\views.py" in saveData
177.                     answer.advice = Advice.objects.get(pk=id)

File "C:\Users\habib\AppData\Local\Programs\Python\Python36-32\lib\site- 
packages\django\db\models\manager.py" in manager_method
 85.                 return getattr(self.get_queryset(), name)(*args, 
**kwargs)

File "C:\Users\habib\AppData\Local\Programs\Python\Python36-32\lib\site- 
packages\django\db\models\query.py" in get
380.                 self.model._meta.object_name

Exception Type: DoesNotExist at /recsystem/saveData/
Exception Value: Advice matching query does not exist.

Не могли бы вы опубликовать обратную связь (ошибки)?

Adam Jaamour 16.04.2018 16:36
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
1
210
2

Ответы 2

Ваш вопрос немного неясен для меня, но такая ошибка буквально произошла, когда вы пытались получить несуществующие данные из базы данных с помощью метода Model.objects.get().

Я подозреваю, что ваша проблема заключается в следующем коде.

Advice.objects.get(pk=id)

Чтобы убедиться в этом, выполните отладку этой точки, чтобы получить id, а затем вручную проверьте в базе данных, существуют ли данные, связанные с этим id, или нет.

Также вы можете использовать другой метод для извлечения данных из базы данных, например get_object_or_404(Advice, pk=id), или даже метод filter() может вам помочь.

Что ж, довольно ясно, что ошибка именно в этой строке, но вопрос в том, почему? Поскольку идентификатор существует в базе данных, как и объект

Farhan Habib 16.04.2018 16:51

@SyedFarhanHabib ты уже решил это? Кстати, вы уверены, что идентификатор действителен для каждого случая в этом цикле. Я так не думаю.

Shubho Shaha 17.04.2018 09:06

Тип исключения: DoesNotExist означает, что вы фильтруете на основе pk, но данные за "=" не являются идентификатором. Убедитесь, что itertools.repeat (adviceList) - это список идентификаторов.

Другие вопросы по теме