BoJ*_*man 48 django django-models django-views
当我尝试将属性与另一个具有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()
Run Code Online (Sandbox Code Playgroud)
输出 LearningObjective.objects.all()
[<LearningObjective: lO1>, <LearningObjective: lO2>, <LearningObjective: lO3>]
Run Code Online (Sandbox Code Playgroud)
输出 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>]
Run Code Online (Sandbox Code Playgroud)
意见
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()
})
Run Code Online (Sandbox Code Playgroud)
Cra*_*eek 103
get()
返回了多个主题 - 它返回2!
上面的错误表明在使用get()查询时,您在数据库中有多个与您传递的特定参数相关的记录,如
Model.objects.get(field_name=some_param)
Run Code Online (Sandbox Code Playgroud)
为了避免将来出现此类错误,您始终需要根据架构设计进行查询.在您的情况下,您设计了一个具有M2M关系的表,因此显然该字段将有多个记录,这就是您收到上述错误的原因.
所以不要使用get()
你应该使用filter(),它将返回多个记录.如
Model.objects.filter(field_name=some_param)
Run Code Online (Sandbox Code Playgroud)
请阅读有关如何在django中进行查询的信息.
Fal*_*gel 13
get()
返回一个对象.如果没有现有对象返回,您将收到<class>.DoesNotExist
.如果您的查询返回多个对象,那么您将得到MultipleObjectsReturned
.您可以在此处查看有关get()查询的更多详细信息.
同样,如果多个项与get()查询匹配,Django会抱怨.在这种情况下,它将引发MultipleObjectsReturned,它再次是模型类本身的属性.
M2M将返回与其相关的任意数量的查询.在这种情况下,您可以使用查询接收零个,一个或多个项目.
在您的模型中,您可以关注我们:
for _topic in topic.objects.all():
_topic.learningobjective_set.all()
Run Code Online (Sandbox Code Playgroud)
您可以使用_set
在M2M上执行选择查询.在上述情况下,您将过滤learningObjective
与每个主题相关的所有内容
归档时间: |
|
查看次数: |
69491 次 |
最近记录: |