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,则可以轻松地将现有的自动中间表“转换”为一个明确的OR,也可以创建一个全新的OR,然后将现有数据迁移到新表,然后再删除旧表。
这两种方法均在此处说明:Adding a "through" table to django field and migrating with South?
考虑到您想对其定义进行的更改,我可能会选择创建一个新表,然后将数据迁移过来。测试以确保所有数据仍然存在(并且您所做的更改满足您的要求),然后删除旧的中间表。
考虑到这些表每行都只能容纳3个整数,即使您有很多房屋和所有者,这也很容易管理。
关于django - django ManyToManyField和on_delete,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15303059/