我是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做到这一点的最佳方式是什么?
由于
答案 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关系。