我有两个简单的模型Article
和Topic
,您可以猜测每篇文章都属于一个或多个主题。
这个小应用程序的主要功能是显示用户选择的特定主题的所有文章。
ManyToManyField应该有哪个型号?对于我的用例,我认为将它放在Topic
模型中是有意义的。但是,如果我这样做,我总是需要2个查询,如果我添加一篇新文章(Article
模型上的1和Topic
模型上的1来建立关系)。
我发现了这个generic rule,但在这种情况下它并没有给我太多帮助。
答案 0 :(得分:3)
“通常,ManyToManyField实例应该放在将要在表单上编辑的对象中。在上面的示例中,浇头是在Pizza(文章)中(而不是具有比萨饼(文章)ManyToManyField的Topping(主题))因为考虑披萨(文章)有浇头(主题)而不是顶部(主题)在多个披萨(文章)上更自然。上面设置的方式,披萨(文章)形式将让用户选择浇头(话题)。” - docs
只是引用,因为有趣的是,文档的重点在于UI而不是ORM。
此外,您可能已经这样做,以防万一,我希望通过shell与我的应用互动,以便在这种情况下尝试不同的查询。
答案 1 :(得分:0)
我会说你的工作最重要 - >下。哪个顶级对象应该具有关系描述(ManyToManyField)。
为什么呢?从用户界面的角度来看待事物。在进入文章和线程之前,您将显示TOPICS或FORUMS列表。 RESTful网址也遵循这个逻辑,因为网址通常有TOPIC / topic_id / post / post_id /而不是相反。出于这个原因我认为将ManyToManyField添加到Topic而不是发布到论坛而不是文章/帖子是有意义的。
你也可以使用酷的django之类的东西,比如
Topic.objects.get(id = topic_id).select_related()
我的2美分。
<强> EDIT1 强>
我不会一直遵循这个建议。例如:
有人,有集团,这是为了识别一群人。哪里放多个地区? Django已将多人连接与其Person(django.contrib.auth.models类用户通过mixin)而不是Group。在一个案例中我反过来做了。为什么?因为我希望用户能够在Group的视图中将Person添加到Group而不是Person的视图。而且我不想做一些事情,比如通过一堆人来为每个人添加单个组。回顾这一点,我仍然不知道这是不好还是好的决定,因为它会给我带来任何问题:P
所以我想我想说你应该分别评估每个案例,并始终提前考虑将来你想对每个类和对象做些什么。
<强> / EDIT1 强>