python - 无法在 django 中检查多行字符串
问题描述
我实际上想检查用户的答案是correct
or incorrect
。当我尝试使用纯 python 代码输入虚拟数据时,它可以正常工作。
但是,当我尝试将它添加到 django 中时,它对多行无效, 仅对一行有效。
无论如何我也尝试了3种方法,但仍然不起作用。在我看来,也许是因为\n
问题。
我检查了type
( correct_answer
& user_answer
) 的两个 s,它完全给了我<class 'str'>
。
class UserAnswerView(APIView):
allowed_methods = ('post',)
permission_classes = (permissions.AllowAny,) # just for test
serializer_class = UserAnswerSerializer
def validate_answer(self, exercise_id, user_answer):
exercise = Exercise.objects.get_or_none(id=exercise_id)
if exercise and user_answer:
if isinstance(user_answer, str):
correct_answers = exercise.answer_set.published()
# [method 1]
# return correct_answers.filter(Q(answer__icontains=user_answer)).exists()
# [method 2]
# for correct_answer in correct_answers:
# if correct_answer.answer == user_answer:
# return True
# [method 3]
return any(c.answer == user_answer for c in correct_answers)
return False
这是models.py
;
class Exercise(TimeStampedModel):
id = models.BigAutoField(primary_key=True)
title = models.CharField(_('Title'), max_length=200)
order = models.PositiveIntegerField(_('Order'), default=1)
course = models.ForeignKey(Course, on_delete=models.CASCADE)
sort_description = models.TextField(_('Sort Description'))
description = models.TextField(_('Description'))
initial_script = models.TextField(_('Initial Script'), blank=True)
objects = CustomManager()
def __str__(self):
return self.title
class Answer(TimeStampedModel):
id = models.BigAutoField(primary_key=True)
exercise = models.ForeignKey(Exercise, on_delete=models.CASCADE)
answer = models.TextField(_('Answer'), help_text=_('The correct answer'))
objects = CustomManager()
def __str__(self):
return self.answer[:50]
在我的测试中,我将此代码放入user_answer
表单中,并且correct_answer
.
from datetime import datetime
now = datetime.now()
print(now)
反正我也在数据库里放了一些有效的答案;
使用 post 方法处理的请求
$.ajax
也是 DRF,所有请求数据都发送到后端。
解决方案
在这里,问题出在数据库中,它以某种方式添加\r
。所以,我需要更换它。在我的测试中,我试图将它们打印到列表模式中:
number = 0
for canswer in correct_answers:
number += 1
print([number, canswer.answer])
print([number, user_answer])
print('')
并且发现了BIG问题,不一样;
[1, 'from datetime import datetime\r\nnow = datetime.now()\r\nprint(now)']
[1, 'from datetime import datetime\n\nnow = datetime.now()\nprint(now)']
[2, 'from datetime import datetime\r\n\r\nnow = datetime.now()\r\nprint(now)']
[2, 'from datetime import datetime\n\nnow = datetime.now()\nprint(now)']
所以,我只需要更换它;
for canswer in correct_answers:
correct_answer = canswer.answer.replace('\r', '')
user_answer = user_answer.replace('\r', '')
if correct_answer == user_answer:
return True
推荐阅读
- vue.js - 没有重复值的多个下拉列表
- python - Alembic 无法更新数据库,无限重试
- python - pyqt5中使用opencv放大图片后图片扭曲变形
- node.js - 将结构(extensionObject)添加到 node-opcua 服务器
- amazon-web-services - 如何一次性将多个表从 AWS DynamoDB 迁移到 AWS DynamoDB
- java - Mockito 模拟 WebClient Json 响应
- python - 引导 NumPy 时遇到问题
- python - 如何使用python按日期过滤postgresql查询
- powershell - 如何从 Powershell 调用批处理文件,使用自定义 .cmd 运行它?
- database - 如何有效地为文档数据库完成最终一致性?