1 回答
TA贡献1752条经验 获得超4个赞
首先(部分无关但不完全),你不应该get_object_or_404()在这里使用。此函数只是详细视图中递归代码模式的简单快捷方式(尝试获取模型实例并在未找到时返回 404 HTTP 响应)。检索模型实例的正确方法是YourModel.objects.get(pk=xxx),YourModel.DoesNotExist如果找不到匹配的记录,它将引发异常。
第二点(部分无关但很好),您的视图应该只接受 POST 请求 - GET 请求不得修改服务器状态。
现在问/您的问题:您当然只能使用现有的 FantaSquadra 记录,并且不能保证您的随机数与现有的 pk 匹配。你可以用蛮力的方式解决它:
while True:
num = random.randint(1,3)
try:
obj = FantaSquadra.objects.get(pk=num)
break
except FantaSquadra.DoesNotExist:
continue
但这会非常低效。一个更简单的解决方案是从现有FantaSquadra pk 列表中随机挑选一个 pk :
pks = list(FantaSquadra.objects.values_list("pk", flat=True))
num = random.choice(pks)
# now you're garanteed to have a matching object
obj = FantaSquadra.objects.get(pk=num)
作为一个额外的好处,您现在可以通过在选择记录之前过滤您的查询集来限制潜在的候选人。
编辑:
此外,您的Partita.creaP()方法显然是错误的——它不“创建”任何东西,它只更新当前实例的casa和traferta属性Partita(并且不保存它)。它也没有用,因为 Django 查询集已经提供了一种创建(真正创建)新记录的方法,非常令人惊讶的是,它命名为 'create()`:
partita = Partita.objects.create(casa=cas,traferta=tra)
至于您收到的错误消息:您的creaP()方法是一个实例方法,因此应该在实例上调用它(在这种情况下,Python 会自动将您调用该方法的实例作为第一个('self')参数传递) ,不在课堂上。好吧,你也可以在类上调用它,但是你必须明确地传递一个Partita实例——这意味着你必须首先创建一个。只是路过尚未定义的名称之前,只能导致一个NameError明显。
请不要冒犯,但看起来您并不真正了解自己在做什么,只是尝试任何事情直到它似乎起作用为止。这种编程方法是众所周知的反模式,实际上,它行不通。我建议你花点时间学习Python(做官方教程+浏览文档)和Django(同上),这会节省你很多时间和痛苦。
添加回答
举报