Python 多对多关系的Django方向

Python 多对多关系的Django方向,python,django,django-models,Python,Django,Django Models,我有两个简单的模型文章和主题,你可以猜到,每一篇文章都可以属于一个或多个主题 这个小应用程序的主要功能是显示用户选择的特定主题的所有文章 什么型号应该有ManyToManyField?对于我的用例,我认为将其放在主题中是有意义的。但是,如果我这样做,如果我添加一篇新文章,我将始终需要2个查询(1个关于文章模型,1个关于主题模型以建立关系) 我发现了这个,但在这种情况下对我没有多大帮助。我想说你是自上而下工作的。哪一个是顶级对象应该具有关系描述(ManyToManyField) 为什么??从用户界

我有两个简单的模型
文章
主题
,你可以猜到,每一篇文章都可以属于一个或多个主题

这个小应用程序的主要功能是显示用户选择的特定主题的所有文章

什么型号应该有ManyToManyField?对于我的用例,我认为将其放在
主题中是有意义的。但是,如果我这样做,如果我添加一篇新文章,我将始终需要2个查询(1个关于
文章
模型,1个关于
主题
模型以建立关系)


我发现了这个,但在这种情况下对我没有多大帮助。

我想说你是自上而下工作的。哪一个是顶级对象应该具有关系描述(ManyToManyField)

为什么??从用户界面的角度看问题。在进入文章和主题之前,请先列出主题或论坛列表。RESTful URL也遵循这一逻辑,因为URL通常有TOPIC/TOPIC\u id/post/post\u id/而不是相反。出于这个原因,我认为在主题中添加许多字段是有意义的,而不是在帖子中添加,在论坛中添加,而不是在文章/线程中添加

你也可以使用很酷的django东西,比如

Topic.objects.get(id = topic_id).select_related()
反正我的2美分

Edit1

我并不是一直遵循这个建议。例如:

有个人也有团体,这意味着识别一群人。把manytomanyfield放在哪里?Django已通过mixin将多个连接放到其Person(Django.contrib.auth.models类用户)而不是组。有一次我用另一种方法。为什么?因为我希望用户能够在组视图而不是个人视图中将个人添加到组中。我不想做一些类似于在一群人之间循环的事情,为每个人添加一个组。回顾这一点,我仍然不知道这是一个好的还是坏的决定,因为无论哪种方式,这都会给我带来问题

所以我想我想说的是,你应该分别评估每一个案例,并且总是提前考虑你将来想对每个类和对象做什么

/Edit1

“通常,许多域实例应该放在表单上要编辑的对象中。在上面的示例中,toppings在Pizza(文章)中(而不是Topping(主题)有pizzas(文章)ManyToManyField),因为认为Pizza(文章)有toppings(主题)更自然而不是多个比萨饼(文章)上的一个配料(主题)。按照上面的设置方式,比萨饼(文章)表单将允许用户选择配料(主题)。”-

只是因为有趣才引用,文档的重点更多的是UI而不是ORM


另外,您可能已经这样做了,以防万一,我喜欢通过与我的应用程序进行交互,在这种情况下尝试不同的查询。

谢谢,这听起来是一个很好的论点。现在,如果一篇文章只能属于一个主题,那么它是一个多对一的关系呢?然后django会强迫我在
文章
模型中定义一个外键?我需要添加一个额外的行,比如article\u object.topic\u set.articles.add(article\u object)。假设topic有manytomanyfield。然后使用topic.articles.add(Article)将文章添加到主题中。这将创建对象之间的连接,您也可以通过Article.topic\u set.get()反向连接。如果您对对象之间的关系感兴趣,那么也许您应该查找django-tagging。虽然我喜欢引用的第一行,但我认为这个比萨饼示例不具有可比性。在我的事业中,主题确实有文章,而不是相反。(或者,文章属于主题)