3

我正在构建一个将计算机硬件组合在一起的应用程序。这是我第一次使用 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_horizo​​ntal 小部件!重写我的计算机模型以具有外键字段加上内存对象数量的字段?但是我不会得到 ManyToMany API 工具。帮助!

4

2 回答 2

7

编辑:对不起,我没有很好地阅读你的帖子,关于不想使用“通过”。

规避该问题的一种方法是使用“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

于 2012-12-14T20:38:07.990 回答
0

不,这不是妥协,即使你不为通过的东西创建另一个表,django 也会创建它来准确记住与每台计算机相关联的内存,所以你自己做更好......这也是允许您在其中获取具有特定内存的特定计算机所需的其他字段

于 2012-12-15T12:20:03.667 回答