gpt4 book ai didi

python - Django 1.7 : how to make ManyToManyField required?

转载 作者:太空宇宙 更新时间:2023-11-03 12:59:10 25 4
gpt4 key购买 nike

我有一个包含 ManyToManyField 的 Django 模型。我需要要求用户在此字段中选择至少一个 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 定义或为 Person 模型覆盖 save() 方法来解决这种情况。

是否可以通过设置 ManyToManyField 选项来防止在未选择至少一项 Skill 的情况下创建 Person?或者我需要创建自定义逻辑来处理这种情况?谢谢。

我使用 Django 1.7Python 3.4


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

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

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

admin.site.register(Person, PersonAdmin)

最佳答案

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

原因是每个 m2m 关系都有一个外键记录 m2m 关系的两边。 SQL 无法强制存在关系的引用端,只能强制存在关系的引用端。

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

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

InlineModelAdmin 中,这可以通过指定 min_num 轻松完成。 (1.7+):

class PersonSkillsInline(admin.TabularInline):
model = Person.skills.through
min_num = 1
extra = 2

关于python - Django 1.7 : how to make ManyToManyField required?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28840621/

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