【问题标题】:Django manytomany: adding multiple, non-unique relationships?Django manytomany:添加多个非唯一关系?
【发布时间】:2012-12-02 20:33:37
【问题描述】:

我正在构建一个将计算机硬件组合在一起的应用。这是我第一次使用 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 工具。救命!

【问题讨论】:

    标签: python django django-orm


    【解决方案1】:

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

    【讨论】:

    • 我不同意。为什么 django 不能只允许非唯一的 m2m 关系?
    • 好的...如果您要求...请告诉我...它将如何跟踪与什么相关的内容?它必须将这些信息存储在某个地方......所以它使用了这种技术
    • 如果你不习惯这种方法......你可以很好地使用你的自定义 SQL
    • 中间表中只会有重复的行,就像我现在通过使用 through 属性指定我自己的表来执行此操作一样(我现在为此付费,因为我必须使用内联而不是具有更多功能的常规管理模型)。而且,不,我不认为可以使用自定义 SQL,因为在创建表时,指定了一些不允许多行的排序 UNIQUE 属性。
    【解决方案2】:

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

    解决此问题的一种方法是使用“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

    【讨论】:

    • 谢谢。我猜这是最好的妥协。
    猜你喜欢
    • 1970-01-01
    • 2011-06-24
    • 2016-09-27
    • 1970-01-01
    • 2013-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-04
    相关资源
    最近更新 更多