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。虽然我喜欢引用的第一行,但我认为这个比萨饼示例不具有可比性。在我的事业中,主题确实有文章,而不是相反。(或者,文章属于主题)