Django manytomany:添加多个,非
我正在构建一个将计算机的硬件放在一起的应用程序。 这是我第一次与Django合作。 假设我有以下型号:
class Memory(models.Model):
partNum = models.CharField()
capacity = models.CharField()
class Computer(models.Model):
name = models.CharField()
memory = models.ManyToManyField(Memory)
# also has cpus, hard drives, and motherboard, but focus on memory for now
一个内存对象可以属于许多计算机对象,而一个计算机对象可以有许多内存对象 - 多对多。 但是,如果使用多个计算机,则计算机需要安装相同的精确记忆棒。
然而,Django的许多领域(默认情况下?)只允许一个记忆 - 计算机关系的实例,它必须是唯一的。 任何方式在这个?
如果我尝试在管理页面中向计算机中添加许多相同的内存对象,则会显示“与此计算机和内存的计算机内存关系已存在”。 如果我尝试向manage.py shell中的服务器对象添加多个相同的内存对象,则看起来只添加了一个内存对象。 如果我尝试手动编辑数据库以使其具有重复条目,则会出现错误,指出该条目已存在。 我看到在数据库结构中,一些不同的“唯一的”索引是强制执行的。 如果我改变了表格以删除该条款,那么这能解决我的问题吗? 大概不会,除非Django经理比预期更愚蠢。
我有什么选择? 写我自己的中介模型,并使用through
构造? 但是,我不会去使用很酷的filter_horizontal小部件! 重写我的电脑模型有一个外键字段加上一个字段的内存对象的数量? 但是,我不会得到ManyToMany API设施。 帮帮我!
编辑:对不起,我没有很好地阅读你的文章,关于不想使用“通过”。
避免这个问题的一种方法是使用“through”参数,其中您可以手动指定一个中间模型用于多对多关系。 这样,您仍然应该拥有(大部分)Django提供的多对多设施。
然后中间模型可以有数量(我会发现比拥有多个关系更容易管理):
class Memory(models.Model):
partNum = models.CharField()
capacity = models.CharField()
class Computer(models.Model):
name = models.CharField()
memory = models.ManyToManyField(Memory, through='ComputerMemory')
class ComputerMemory(models.Model):
memory = models.ForeignKey(Memory)
computer = models.ForeignKey(Computer)
count = models.IntegerField()
有关更多信息,请查看Django文档:https://docs.djangoproject.com/en/dev/topics/db/models/#intermediary-manytomany
不,这不是一个妥协,即使你不为通过的东西创建另一个表,也不会创建它以记住每个计算机与哪个内存相关联,所以更好的是,你自己做这个也是这样允许您获取特定计算机所需的特定内存所需的其他字段
链接地址: http://www.djcxy.com/p/60207.html上一篇: Django manytomany: adding multiple, non
下一篇: Using Django ORM for processing huge numbers of large records