Я получаю TypeError:»аргумент int () должен быть строкой, байтоподобным объектом или числом, а не «Вопросом»»

#python #django #api #django-rest-framework

#python #django #API #django-rest-framework

Вопрос:

Я получаю ошибку, когда пытаюсь извлечь объект вопроса из моего объекта выбора. Ошибка: аргумент int () должен быть строкой, байтоподобным объектом или числом, а не «Вопросом»

У меня есть две модели:

 class Question(models.Model):
    question_text = models.CharField(max_length=200)
    pub_date = models.DateTimeField("date published")

    def __str__(self):
        return self.question_text


class Choice(models.Model):
    choice_text = models.CharField(max_length=200)
    votes = models.IntegerField(default=0)
    question = models.ForeignKey(Question,  related_name='choices', on_delete=models.CASCADE)

    def __str__(self):
        return self.choice_text
 

Вот мое мнение :

 @api_view(['POST', ])
def selectChoice(request):
    try:
        choice_id = request.query_params.get('choice_id')
        selected_choice = get_object_or_404(Choice, id=choice_id)
        selected_choice.votes  = 1
        selected_choice.save()
        questions = get_object_or_404(Question, id=selected_choice.question)
        serializer = QuestionWithAnswer(questions)
        return Response(serializer.data)
    except ValueError as e:
        return Response(e.args[0], status.HTTP_400_BAD_REQUEST)
 

Вот мой сериализатор:

 class ChoiceSerializer(serializers.ModelSerializer):
    class Meta:
        model = Choice
        fields = ('id', 'votes', 'choice_text','question')


class QuestionWithAnswer(serializers.ModelSerializer):
    choices = ChoiceSerializer(many=True)

    class Meta:
        model = Question
        fields = ('id', 'question_text', 'pub_date','choices')
 

И я ожидаю ответа API ниже:

 {
    "id": 2,
    "question_text": "What's your age?",
    "pub_date": "2019-04-13T05:27:39Z",
    "choices": [
        {
            "id": 4,
            "votes": 15,
            "choice_text": "15",
            "question": 2
        },
        {
            "id": 5,
            "votes": 2,
            "choice_text": "16",
            "question": 2
        },
        {
            "id": 6,
            "votes": 2,
            "choice_text": "17",
            "question": 2
        }
    ]
}
 

Комментарии:

1. пожалуйста, поделитесь полной трассировкой стека. И что это QuestionWithAnswer ?

2. Я отредактировал свой вопрос, пожалуйста, проверьте.

Ответ №1:

Вам не нужно выполнять этот get_object_with_404 вызов. selected_choice.question это уже соответствующий объект вопроса, это не идентификатор. Вы можете передать это непосредственно сериализатору.

 serializer = QuestionWithAnswer(selected_choice.question)
 

Комментарии:

1. Как я упоминал в комментарии выше, это решение также работает.

Ответ №2:

Вы используете объект в своем наборе запросов вместо идентификатора. Ваш набор запросов должен выглядеть следующим образом:

 questions = get_object_or_404(Question, id=selected_choice.question.id)
 

Комментарии:

1. Спасибо. Это работает как шарм. Я поддержу ответ, как только у меня будет достаточно кредитов. Пожалуйста, не могли бы вы объяснить немного подробнее, поскольку я новичок в python?

2. Но это неправильный ответ. Как я указываю, весь вызов бесполезен.

3. Это дает мне требуемый результат. Даже ваш ответ работает, но, пожалуйста, кто-нибудь из вас может объяснить разницу и что лучше?

4. С точки зрения набора запросов это правильно @DanielRoseman. Однако ваше решение может лучше подойти для этого случая. В любом случае, Simal, вы в основном пытались запросить базу данных путем «фильтрации» по идентификатору и передачи объекта queryset вместо идентификатора. Посмотрите здесь, чтобы лучше понять. docs.djangoproject.com/en/2.2/topics/http/shortcuts /…