- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
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/
我一直在使用 -Wd Python 的论据,并发现我需要进行大量更改以准备升级到 Django 2.0 python -Wd manage.py runserver 最主要的是 on_delete 是
我正在为 Django 应用程序编写测试。 目前,为了测试级联删除,我创建了实例,删除了父项并断言子项也被删除了。 是否有更好的方法来执行此操作,例如使用 _meta.get_field 检索传递给模
我正在尝试在模型中使用on_delete,但我的IDE要求我提供:收集器,字段,sub_objs,使用(即..., on_delete=models.PROTECT(collector, fields
django 上的 ForeignKey 具有属性 on_delete指定删除引用的对象时的行为。有什么办法可以得到类似的东西 ManyToManyField ? 假设我有以下模型 class Hou
我正在尝试使用 django 运行一些 python 代码,但它返回“构造函数调用中的参数‘on_delete’没有值”。 from django.db import models from djan
我正在和 Phoenix 一起玩,并建立了 has_many 关联。我通常将 on_delete: :delete_all 作为引用列的选项。但是,如果我改变主意并想稍后更改 nilify_all,有
我正在尝试使用 django 运行一些 python 代码,但它返回“构造函数调用中的参数‘on_delete’没有值”。 from django.db import models from djan
我在两个模型之间建立了多对多关系,User 和 Role,通过中间表 UserRoleThrough 实现,它有两个 ForeignKeyField:一个引用 User,另一个引用 Role。据我从文
我在 django 中有一个模型,它具有带有用户模型的外键。 class News(models.Model): user = models.ForeignKey(AUTH_USER_MODE
File "C:\Users\sungk\Git\django_website\blog\models.py", line 5, in class Post(models.Model): F
在下面的示例中,您如何以及在哪里设置默认值? author = models.ForeignKey('作者', on_delete=models.SET_DEFAULT) 最佳答案 对于 SET_DE
请让我考虑以下两个模型: class Policy(models.Model): name = models.SlugField(max_length=256, blank = Fal
请让我考虑以下两个模型: class Policy(models.Model): name = models.SlugField(max_length=256, blank = Fal
我目前正在做 Eric Matthes 所著的《Python 速成类(class)》一书中的一些项目。目前,我正在做实验 19.1,我必须使用以前的代码来制作 Django 项目,同时更改他自己的一些
我正在使用 django 1.2.4(通过 shell 使用 import django django.VERSION 确认)并尝试使用 on_delete=models.SET_NULL 在 For
我对 Django 非常熟悉,但我最近注意到存在一个 on_delete=models.CASCADE与模型选项。我已经搜索了相同的文档,但除了以下内容之外我什么也找不到: Changed in Dj
我对Django非常熟悉,但是最近发现模型中存在on_delete=models.CASCADE和on_delete=models.PROTECT选项, on_delete=models.CASCAD
假设我有一个代理用户模型 class UserWithProfile(User): profile_description = models.TextField() class Met
我有一个 Django 1.3 应用程序,我使用 South 0.7.3 进行数据库迁移。我有一个问题 on_delete=models.SET_NULL删除父实体时,规则似乎没有触发,从而使我违反了
我定义了一个 on_delete我的模型中的约束如下: cliente = models.ForeignKey(Cliente,related_name="cliente",on_delete=mod
我是一名优秀的程序员,十分优秀!