#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 /…