django - get()返回了多个主题

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与每个主题相关的所有内容


小智 6

我有同样的问题,解决方案是obj = ClassName.objects.filter()


lmc*_*lmc 5

Get 应该返回一个并且正好是一条记录,以修复此使用filter(),然后获取返回的查询集的第一个元素以获取您期望从 get 获得的对象,检查之前是否至少返回一条记录也很有用取出第一个元素以避免IndexError