Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django manytomany:添加多个非唯一关系?_Python_Django_Django Orm - Fatal编程技术网

Python Django manytomany:添加多个非唯一关系?

Python Django manytomany:添加多个非唯一关系?,python,django,django-orm,Python,Django,Django Orm,我正在构建一个应用程序,将计算机的硬件整合在一起。这是我第一次与django合作。假设我有以下型号: class Memory(models.Model): partNum = models.CharField() capacity = models.CharField() class Computer(models.Model): name = models.CharField() memory = models.ManyToManyField(Memory)

我正在构建一个应用程序,将计算机的硬件整合在一起。这是我第一次与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中的服务器对象,则似乎只添加了一个内存对象。如果我试图手动编辑数据库以获得一个重复的条目,我会得到一个错误,指出该条目已经存在。我看到在数据库结构中,一些排序为“uniquetogether”的索引正在执行。如果我修改表格以删除该条款,这能解决我的问题吗?可能不会,除非django经理比预期的更愚蠢


我有什么选择?编写我自己的中介模型并使用
构造?但是我不会使用“酷过滤器”水平部件!重写我的计算机模型,让外键字段加上内存对象数字段?但是那样的话,我就不会有太多的API工具了。救命啊

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

规避此问题的一种方法是使用“through”参数,在该参数中,您可以手动指定用于多对多关系的中间模型。这样,您应该仍然拥有Django提供的(大部分)多对多设施

然后,中间模型可以有count(我发现这比拥有多个关系更容易管理):


有关更多信息,请查看Django文档:

不,这不是一个折衷方案,即使您不为through创建另一个表,Django也会创建该表以准确记住与每台计算机关联的内存,因此,最好是您自己做……这也允许您在其中获取具有特定内存的特定计算机所需的其他字段

谢谢。我想这是最好的妥协,我不同意。为什么django不能只允许非唯一的m2m关系?好吧…如果你要求的话…告诉我…它将如何比跟踪与什么相关的东西??它必须将这些信息存储在某个地方……因此它使用这种技术,如果您对这种方法不满意……您可以很好地使用您的自定义SQL,中间表中只会有重复的行,就像我现在通过使用through属性指定我自己的表所做的那样(我现在为此付费,因为我必须使用内联线,而不是常规的管理模型,后者具有更多的功能)。而且,不,我不认为可以使用自定义SQL,因为在创建表时,指定了一些sorta UNIQUE属性,这不允许多行。
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()