gpt4 book ai didi

Django 1.8 : How can I ensure that of Two Fields in a Model, 至少一个或只有一个必须满足条件?

转载 作者:行者123 更新时间:2023-12-04 07:20:22 24 4
gpt4 key购买 nike

对于上下文,这是一个菜单系统。

class Menu(models.Model):
...


class Link(models.Model):
...


class MenuItem(models.Model):
menu = models.ForeignKey(Menu)
submenu = models.ForeignKey(Menu, related_name='submenu', blank=True, null=True)
link = models.ForeignKey(Link, blank=True, null=True)
position = models.IntegerField()

我有两个想要实现的结果:
  • 至少一个 子菜单和链接 不能为空 (子菜单标题可以有链接)
  • 只有 子菜单和链接 必须为空 (子菜单标题不能有链接)

  • 任何高级验证对我来说都是新的,因此代码示例将非常有帮助。

    在本例中,数据将仅通过 Django Admin 添加

    最佳答案

    关于模型验证的文档很差。有许多(已关闭的)问题涉及它,但仍不清楚。

    此解决方案有效,无需更改任何表单:

    from django.core.exceptions import ValidationError

    class MenuItem(models.Model):
    ...

    def clean(self):
    super(MenuItem, self).clean()
    if self.submenu is None and self.link is None:
    raise ValidationError('Validation error text')
    clean()有一些默认的验证功能,所以需要首先调用属于 Model 的 clean。

    以上确保至少使用了两个字段之一,如果没有,则引发异常。我只在管理界面中测试过这个。

    我不知道这是否是正确的方法,如果有人对 Django 中的模型验证有更好的理解,我很想知道更多。来自其他语言和框架,这确实是编写自定义验证的自然方式。

    关于Django 1.8 : How can I ensure that of Two Fields in a Model, 至少一个或只有一个必须满足条件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31784695/

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