我正在构建一个将计算机硬件组合在一起的应用程序。这是我第一次使用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的manytomany字段(默认情况下?)只允许一个内存 - 计算机关系的实例,它必须是我独一无二的。有什么方法吗?
如果我在管理页面中尝试将许多相同的内存对象添加到计算机,它会说“计算机内存与此计算机和内存的关系已经存在”。如果我尝试将同一个内存对象多次添加到manage.py shell中的服务器对象,则看起来只添加了一个内存对象。如果我尝试手动编辑数据库以具有重复条目,则会收到错误消息,指出该条目已存在。我看到在数据库结构中,某些“独特在一起”的索引是强制执行这一点。如果我改变了表来删除该子句,那会解决我的问题吗?除非django经理比预期更愚蠢,否则可能不会。
我有什么选择?编写我自己的中间模型并使用through
构造?但后来我不会使用酷的filter_horizontal小部件!重写我的计算机模型以获得外键字段以及内存对象数字段?但是我不会得到ManyToMany API工具。救命啊!
答案 0 :(得分:7)
编辑:抱歉,我没有充分阅读你的帖子,不想使用'通过'。
解决问题的一种方法是使用“通过”参数,您可以在其中手动指定用于多对多关系的中间模型。通过这种方式,你应该仍然拥有(大部分)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
答案 1 :(得分:0)
不,这不是妥协,即使你没有为通过事物创建另一个表,也不是django会创建它以准确记住与每台计算机相关联的内存,所以更好的是你自己做...这也允许您获取具有特定内存的特定计算机所需的其他字段