Django 1.7:如何使ManyToManyField成为必需的?

2023-12-29

我有一个 Django 模型ManyToManyField在里面。我需要要求用户在此字段中至少选择一个 M2M 值。

我尝试设置blank=False到M2M领域,但没有帮助。

class Skill(models.Model):
    name = models.CharField(max_length=200)

class PersonSkills(models.Model):
    person = models.ForeignKey('Person')
    skill = models.ForeignKey('Skill')

class Person(models.Model):
    name = models.CharField(max_length=200)
    skills = models.ManyToManyField('Skill', through='PersonSkills')

p = Person(name='Bob')
p.save()
# success, but I expect that this should throw ValidationError, because I didn't select at least one Skill for this person

我可以通过自定义解决这种情况Form定义或覆盖save()方法用于Person model.

是否可以阻止创建Person没有至少一个Skill已选择,已设置ManyToManyField选项?或者我需要创建自定义逻辑来处理这种情况?谢谢。

I use Django 1.7 and Python 3.4


更新1。如何创建ModelForm控制M2M?因为在cleaned_data我只有我传递的字段Person表单,并且没有我作为 M2M 字段传递的数据。我尝试在管理站点中创建对象并控制它Skills已选择。我输入Skill's via inline.

# admin.py
class PersonSkillsInline(admin.TabularInline):
    model = Person.skills.through
    extra = 2

class PersonAdmin(admin.ModelAdmin):
    inlines = [PersonSkillsInline]

admin.site.register(Person, PersonAdmin)

在数据库级别......不,这是不可能的。对此的任何执行都必须来自您的应用程序逻辑。

原因是每个 m2m 关系都有一个带有外键的记录toM2M 关系的双方。 SQL 不能强制关系的引用方存在,只能强制关系的被引用方存在。

此外,您也无法在模型中强制执行它,因为Person必须先创建并保存,然后才能分配任何多对多关系。

您唯一的选择是在表单或视图中强制执行它。

In an InlineModelAdmin这可以通过指定轻松完成min_num https://docs.djangoproject.com/en/1.7/ref/contrib/admin/#django.contrib.admin.InlineModelAdmin.min_num (1.7+):

class PersonSkillsInline(admin.TabularInline):
    model = Person.skills.through
    min_num = 1
    extra = 2
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Django 1.7:如何使ManyToManyField成为必需的? 的相关文章

随机推荐

  • subversion中“让深度粘性”有什么作用?

    我很难找到有关在 SVN 工作副本上使用粘性深度设置的行为的明确文档 在 SVN 中 当使用 更新到修订版本 对话框时 会有一个 使深度粘性 复选框 使深度粘性和非粘性之间有哪些有效区别 当深度为粘性时 您每次更新时都将使用相同的设置进行更
  • PHP以真正的二进制方式读取二进制文件

    我在谷歌上搜索了我的问题 但没有找到解决方案 我想读取一个文件并将缓冲区转换为二进制 例如 10001011001011001 如果我从文件中有这样的东西 bmoov lmvhd tF tF K T trak tkh d tF tF K e
  • Symfony 2:安装并启用 intl 扩展

    我在用着XAMPP for Windows并决定尝试一下Symfony 2 当我到达时Symfony Configuration它建议我安装并启用的页面intl 我尝试阅读PEAR s and PECL s指导 因为我完全0关于这个主题 开
  • std::ostringstream 覆盖初始化字符串

    以下代码会生成 0004567 铿锵 7 https repl it agustinf ostringstream bug or anti feature main cpp include
  • 连接到 Github 时“无法生成 ssh”,但 ssh -T [电子邮件受保护] 有效?

    我很难让 Github Netbeans 正常工作 我想将 ssh 与 git 在 Windows 7 上 结合使用来提交或克隆项目 但我不断收到此错误消息 git clone email protected cdn cgi l email
  • NSOutlineView 缩进问题

    我使用 NSOutlineView 对象来表示文件结构 并发现它不会正确缩进任何可扩展的子项 尽管它会缩进不可扩展的子项 这是一张图片来说明我的意思 在此示例中 AnotherFolder 是 Folder2 的子级 但它没有与其他缩进文件
  • F# 中的代码分析

    作为一名 C 开发人员 我从 Microsoft 的代码分析中受益匪浅 然而 在 F 中 代码分析似乎并不是开发周期的一个组成部分 我花了一段时间才在 F 项目上启用 CA 但这博客有帮助 http blog nikosbaxevanis
  • 将 div 水平和垂直居中,并在调整父级大小时保持居中[重复]

    这个问题在这里已经有答案了 我想始终将 div 水平和垂直居中 我可以减少 增加窗口的宽度 div 将通过始终保持在窗口的中心进行响应 cent height 50px width 50px background color black m
  • 是否可以使用 winmerge 查看 cygwin 的 git diff?

    我喜欢在 cygwin 上使用 git 但唯一的缺点是当我想这样做时git difftool我无法使用任何有用的东西 git diff大多数时候对我来说很好 但有时我想使用 winmerge 通过以下方式查看这些差异git difftool
  • 想要将特定的 div 向右移动

    我想将特定的 div 移到右侧 以便左侧的 div 获得更多空间来显示其中的内容 我在 CSS 中尝试了一些东西 但我知道我做错了 在 CSS 中 我 login box width 200px margin left 50px 您可以在该
  • 查找所有子项完全匹配的父项 ID

    场景 假设我们有一组代表四个关键概念的数据库表 实体类型 例如帐户 客户等 实体 例如上述实体类型的实例 同类群组 命名组 群组成员 组成群组成员的实体 群组的规则是 一个队列始终至少有一名队列成员 群组成员对于该群组必须是唯一的 即实体
  • Tensorflow、多标签精度计算

    我正在研究多标签问题 并试图确定模型的准确性 我的型号 NUM CLASSES 361 x tf placeholder tf float32 None IMAGE PIXELS y tf placeholder tf float32 No
  • 如何在 iOS 应用程序中阻止屏幕截图

    我想构建一个应用程序 在其中我想阻止用户的屏幕截图 就像在 Netflix 应用程序中一样 它应该像在 Netflix 中一样返回黑屏截图 现在我无法得到任何有关此事的信息 不知道Netflix是怎么处理的 有什么方法可以检测块中捕获的图像
  • 提高大小超过 40 GB (Sql Server 2005) 且每月增长约 3GB 的数据库性能的技巧

    当前的数据库或我们的项目本月已超过 40 GB 平均每月增长约 3 GB 现在 所有表都已最佳规范化 并且已使用正确的索引 但随着规模的增长 即使是像 select count 1 from table 这样的基本查询 也需要更多的时间来触
  • spring hibernate没有获取参数的值

    我尝试使用以下命令进行 API 调用post通过邮递员的方法到我的 Spring Boot 应用程序 这是输入 username name password 1234 age 12 salary 5000 role 1 这是控制器中的代码
  • 仅选择在特定时间发生的行

    我已经读过C csv和datetime列是一个object type 我想得到每一行23 45 00无论日期如何 都在其中 我想拥有datetime作为索引 我想转换datetimedatetime64 ns 的索引 我相信 pandas
  • Knockout JS单选按钮点击事件重置选择

    我在单选按钮列表上绑定了 选中 和 单击 事件 但每当单击单选按钮时 选择都不会保留 我一定做错了什么 如果你们能指出我正确的方向 我真的很感激 请参阅在这里小提琴 http jsfiddle net rasikasampath jhHkD
  • Postgres子查询,按子查询排序

    如果我有一个查询 例如 select from tbl where id in 10 20 9 4 返回的结果可能按以下顺序排列 4 9 10 20 但是如果想要维护传递到初始查询中的列表的顺序怎么办 你会如何处理这个问题 最终 我在这里使
  • 哪里可以下载Python3.3的Scipy? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我想在Windows中安装Scipy for Python3 3 但我在以下链接中只找到了Python 3 2版本之前的Scipy安装文件 http
  • Django 1.7:如何使ManyToManyField成为必需的?

    我有一个 Django 模型ManyToManyField在里面 我需要要求用户在此字段中至少选择一个 M2M 值 我尝试设置blank False到M2M领域 但没有帮助 class Skill models Model name mod