首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >django - get()返回多个主题

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

Stack Overflow用户
提问于 2014-02-27 09:06:54
回答 8查看 160.3K关注 0票数 93

当我试图将一个属性与另一个具有M到M关系的属性关联时,我收到了以下错误:

get()返回多个主题--它返回了2!

你们能告诉我这意味着什么吗?或者提前告诉我如何避免这个错误?

模型

代码语言:javascript
运行
复制
class LearningObjective(models.Model):
    learning_objective=models.TextField()

class Topic(models.Model):
    learning_objective_topic=models.ManyToManyField(LearningObjective)
    topic=models.TextField()

LearningObjective.objects.all()输出

代码语言:javascript
运行
复制
[<LearningObjective: lO1>, <LearningObjective: lO2>, <LearningObjective: lO3>]

Topic.objects.all()输出

代码语言:javascript
运行
复制
[<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>]

视图

代码语言:javascript
运行
复制
 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()
                  })
EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2014-02-27 09:30:10

get()返回了多个主题--它返回了2个!

上面的错误指示您在DB中有多条记录与使用get()查询时传递的特定参数相关,例如

代码语言:javascript
运行
复制
Model.objects.get(field_name=some_param)

为了避免将来发生这种错误,您总是需要按照模式设计进行查询。在您的示例中,您设计了一个带有多对多关系的表,因此很明显,该字段将有多个记录,这就是您获得上述错误的原因。

因此,与其使用get(),不如使用filter(),它将返回多个记录。比如

代码语言:javascript
运行
复制
Model.objects.filter(field_name=some_param)

请阅读如何在django 这里中进行查询。

票数 189
EN

Stack Overflow用户

发布于 2014-02-27 09:23:30

get()返回一个对象。如果没有要返回的现有对象,您将收到<class>.DoesNotExist。如果查询返回多个对象,那么您将得到MultipleObjectsReturned。有关get()查询的更多细节,您可以查看这里

类似地,如果多个项与get()查询匹配,Django将发出投诉。在本例中,它将引发MultipleObjectsReturned,这也是模型类本身的一个属性。

与之相关的M2M将返回任意数量的查询。在这种情况下,您可以使用查询接收零、一个或多个项。

在您的模型中,您可以这样做:

代码语言:javascript
运行
复制
for _topic in topic.objects.all():
    _topic.learningobjective_set.all()

可以使用_set对M2M执行select查询。在上述情况下,您将过滤与每个主题相关的所有learningObjective

票数 20
EN

Stack Overflow用户

发布于 2014-02-27 09:22:46

get应该返回一条而且正好是一条记录,以修复这个使用filter(),然后取回返回的queryset的第一个元素,以获得您期望从Get中得到的对象,而且在取出第一个元素以避免IndexError之前,检查是否至少返回了一个记录是有用的。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22063748

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档