gpt4 book ai didi

django ManyToManyField 和 on_delete

转载 作者:行者123 更新时间:2023-12-03 01:11:43 26 4
gpt4 key购买 nike

django 上的

ForeignKey 具有属性 on_delete指定删除引用的对象时的行为。有什么办法可以得到类似的东西 ManyToManyField

假设我有以下模型

class House(models.Model):
owners = models.ManyToManyField(Person)

默认行为是级联,所以如果我删除一个碰巧拥有房子的人,它就会从所有者中消失(也就是说,显然,它不再拥有任何房子)。我想要的是,如果一个人是所有者,则无法将其删除。也就是说,我想要 on_delete=models.PROTECT。这可能吗?

我知道内部 ManyToManyField 被转换为另一个具有两个 ForeignKey 的模型(在本例中一个用于房屋,一个用于个人),因此应该可以实现这。有什么想法吗?我想避免设置 through属性到新模型,因为这会产生一个新表(我想保留旧表)。

编辑:我已经跟踪了 django 创建适当的 m2m 模型的位置:

def create_many_to_many_intermediary_model(field, klass):
from django.db import models
# ...
# Construct and return the new class.
return type(name, (models.Model,), {
'Meta': meta,
'__module__': klass.__module__,
from_: models.ForeignKey(klass,
related_name='%s+' % name,
db_tablespace=field.db_tablespace),
to: models.ForeignKey(to_model,
related_name='%s+' % name,
db_tablespace=field.db_tablespace)
})

相关行是

to: models.ForeignKey(to_model,
related_name='%s+' % name,
db_tablespace=field.db_tablespace)

我希望是这样

to: models.ForeignKey(to_model,
related_name='%s+' % name,
db_tablespace=field.db_tablespace,
on_delete=models.PROTECT)

除了猴子修补整个事情并为 ManyToManyField 创建一个新类之外,还有什么方法可以做到这一点?

最佳答案

我认为最明智的做法是使用显式直通表。我意识到您已经说过您不希望“因为这会产生一个新表(我想保留旧表)。”

我怀疑您担心的是丢失您所拥有的数据。如果您使用 South,您可以轻松地将现有的自动中间表“转换”为显式表,或者您可以创建一个全新的表,然后在删除旧表之前将现有数据迁移到新表。

这两种方法的解释如下:Adding a "through" table to django field and migrating with South?

考虑到您想要对其定义进行更改,我可能会选择创建一个新表,然后迁移数据。进行测试以确保所有数据仍然存在(并且您的更改符合您的要求),然后删除旧的中间表。

考虑到这些表每行仅保存 3 个整数,即使您有很多房屋和业主,这也可能是一个非常易于管理的练习。

关于django ManyToManyField 和 on_delete,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15303059/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com