django中的单向一对多和多对多

时间:2010-07-07 12:29:21

标签: django django-models entity-relationship

我是django的新手。 我有2个简单的对象,让我们调用它们 - 文件和文件组: - 文件组可以保存文件列表,根据“订单”字段进行排序。 - 每个文件可以与多个组相关联。

所以基本上,db表将是: 1)文件 2)File_Group 3)File_Group_Mapping表,除了文件和文件组的fk之外,还有一个名为“order”的列。

这里有多对多的关系,但File对象不应该知道FileGroup的存在(在我的情况下没有意义)

我的问题 - 有没有办法在这里创建单向多对多/一对多关系?我怎样才能用django进行建模?

我找不到通过django使其单向的方法。 我看到了一个使用类似 -

的解决方案
class FileGroup(...):
    files = models.ManyToManyField(File, through='FileGroupMapping')

但这会使File对象知道FileGroup。

我也可以通过映射模型文件中的File_Group_Mapping表来实现这一点 -

class FileGroupMapping(...):
     files = models.ForeignKey(File)
     groups = models.ForeignKey(FileGroup)
     order = models...

通过django做到这一点的最佳方式是什么?

由于

2 个答案:

答案 0 :(得分:4)

我也是一个hibernate用户。我完全理解你在寻找什么,只是尝试在你的多对多关系中使用属性“symmetrical = False”,这将使关系单向。

class FileGroup(models.Model):
  files = models.ManyToManyField(File, symmetrical = False)

这应该可以解决问题!

答案 1 :(得分:1)

你的两种方法是相同的。在幕后,Django creates a lookup table for a ManyToManyField。从ORM的角度来看,您可以将ManyToManyField置于任一模型上,尽管它会对管理员产生影响,并且您希望使用'limit_choices_to'选项。使用'through'可以将列添加到查找表中,以进一步定义两个模型之间的关系,这正是您通过手动创建查找表所做的。

无论哪种方式,您仍然可以“获取”特定文件所属的文件组,因为Django查询集将双向跟随FK关系。