当我试图将一个属性与另一个具有M到M关系的属性关联时,我收到了以下错误:
get()返回多个主题--它返回了2!
你们能告诉我这意味着什么吗?或者提前告诉我如何避免这个错误?
模型
class LearningObjective(models.Model):
learning_objective=models.TextField()
class Topic(models.Model):
learning_objective_topic=models.ManyToManyField(LearningObjective)
topic=models.TextField()LearningObjective.objects.all()输出
[<LearningObjective: lO1>, <LearningObjective: lO2>, <LearningObjective: lO3>]Topic.objects.all()输出
[<Topic: Topic object>, <Topic: Topic object>, <Topic: Topic object>, <Topic: Topic object>, <Topic: Topic object>, <Topic: Topic object>, <Topic: Topic object>, <Topic: Topic object>, <Topic: Topic object>, <Topic: Topic object>, <Topic: Topic object>, <Topic: Topic object>, <Topic: Topic object>, <Topic: Topic object>]视图
def create_themen(request):
new_topic=Topic(topic=request.POST['topic'])
new_topic.save()
return render(request, 'topic.html', {'topic': topic.objects.all()})
def create_learning_objective(request):
new_learning_objective=LearningObjective(learning_objective=request.POST['learning_objective'])
new_learning_objective.save()
new_learning_objective_topic=Topic.objects.get(topic=request.POST['topic'])
new_learning_objective_topic.new_learning_objective_topic.add(new_learning_objective)
return render( request, 'learning_objective.html', {
'topic': Topic.objects.all(),
'todo': TodoList.objects.all(),
'learning_objective': LearningObjective.objects.all()
})发布于 2014-02-27 09:30:10
发布于 2014-02-27 09:23:30
get()返回一个对象。如果没有要返回的现有对象,您将收到<class>.DoesNotExist。如果查询返回多个对象,那么您将得到MultipleObjectsReturned。有关get()查询的更多细节,您可以查看这里。
类似地,如果多个项与get()查询匹配,Django将发出投诉。在本例中,它将引发MultipleObjectsReturned,这也是模型类本身的一个属性。
与之相关的M2M将返回任意数量的查询。在这种情况下,您可以使用查询接收零、一个或多个项。
在您的模型中,您可以这样做:
for _topic in topic.objects.all():
_topic.learningobjective_set.all()可以使用_set对M2M执行select查询。在上述情况下,您将过滤与每个主题相关的所有learningObjective。
发布于 2014-02-27 09:22:46
get应该返回一条而且正好是一条记录,以修复这个使用filter(),然后取回返回的queryset的第一个元素,以获得您期望从Get中得到的对象,而且在取出第一个元素以避免IndexError之前,检查是否至少返回了一个记录是有用的。
https://stackoverflow.com/questions/22063748
复制相似问题