【问题标题】:Django model self-reference: prevent referencing to itselfDjango模型自引用:防止引用自身
【发布时间】:2017-04-09 16:12:47
【问题描述】:

我有以下型号:

class Category(models.Model):
    name = models.CharField(max_length=255)
    parent = models.ForeignKey('self', related_name='children')

我的问题是如何防止模型引用自身(同一个对象)。对象应该只能指向其他类别而不能指向自身('dogs' 可以有父 'animals' 但不能有父 'dogs')

【问题讨论】:

    标签: django self-reference self-referencing-table


    【解决方案1】:

    你可以重写save方法抛出异常:

    def save(self, *args, **kwargs):
        if self.parent and self.parent.name == self.name:
            raise ValidationError('You can\'t have yourself as a parent!')
        return super(Category, self).save(*args, **kwargs)
    

    【讨论】:

    • 这行不通。由于 self.parent 有属性 id 其中self 仍然没有。你可以做self.parent.name == self.name
    • 谢谢大家,我现在走在正确的轨道上。但后者也不起作用,如果没有父级(它不是必填字段),它会给出 AttributeError,所以我添加了“如果 self.parent 和 self.parent.name == self.name:”。现在它可以工作了,但非法值仍然显示在管理员多项选择下拉列表中。我如何确保没有任何形式等曾经为用户提供该价值?请至少编辑该帖子以修复 AttributeError 部分,然后我会接受它。
    • 据我所知,验证应该在clean()clean_fields()方法docs.djangoproject.com/en/3.1/ref/models/instances/…中完成
    猜你喜欢
    • 2011-06-22
    • 1970-01-01
    • 1970-01-01
    • 2017-04-08
    • 1970-01-01
    • 2021-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多