程序问答   发布时间:2022-06-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了Django:对于唯一性约束,如何将 null 视为等于所有内容?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决Django:对于唯一性约束,如何将 null 视为等于所有内容??

开发过程中遇到Django:对于唯一性约束,如何将 null 视为等于所有内容?的问题如何解决?下面主要结合日常开发的经验,给出你关于Django:对于唯一性约束,如何将 null 视为等于所有内容?的解决方法建议,希望对你解决Django:对于唯一性约束,如何将 null 视为等于所有内容?有所启发或帮助;

在标题中我的意思是等于任何值,而不仅仅是其他空值。

假设我们有一个家庭,有家庭成员(人)和电子设备。有些电子设备是个人的,属于一个人,但有些不属于任何一个家庭成员,例如书房中的一台普通电脑。 然后我们可能会像这样对电子设备进行建模:

class ElectronicDevice(models.Model):
    name = models.CharFIEld(null=false,max_length=64)
    owner = models.ForeignKey(HouseMember,null=True,on_delete=models.CASCADE)

现在假设我们希望设备名称从家庭成员的角度来看是唯一的。家庭成员不应有两个同名设备可供他们使用。所以名称和所有者应该是唯一的,但也不应该有两个设备,一个私有的和一个公共的(所有者为空)具有相同的名称。

因此是正常的 UniqueConsTraint

class Meta:
        consTraints = [
            modelS.UniqueConsTraint(fIElds=['name','owner'],name='uniqe_device_name'),]

不会,因为如果其中一个所有者为空,它仍然允许两个设备具有相同的名称。 仅约束名称字段:

class Meta:
        consTraints = [
            modelS.UniqueConsTraint(fIElds=['name',],]

也不会这样做,因为这不允许两个家庭成员将他们的私人设备命名为相同的名称,尽管我们确实希望允许这样做。

我目前的尝试是限制名称和所有者的唯一性,然后使用 checkConsTraint 不允许名称,如果已经有一个具有该名称的通用设备(所有者为空):

class Meta:
        consTraints = [
            modelS.UniqueConsTraint(fIElds=['name',models.checkConsTraint(check=???,name='no_common_device_with_same_name')
        ]

这是最好的方法还是有更好的解决方案? 如果这是最佳解决方案:如何为此编写 checkConsTraint

解决方法

也许你可以这样尝试:

consTraints = [ 
    modelS.UniqueConsTraint(fields=['name','owner'],condition = Q(owner__isnull=falsE),name='uniqe_device_name'),modelS.UniqueConsTraint(fields=['name'],condition = Q(owner__isnull=TruE),name='uniqe_device_name_without_owner')
]

可以在documentation中找到更多信息。

更新

如果您需要无法通过约束处理的自定义条件,那么最好覆盖保存方法。例如:

class ElectronicDevice(models.Model):
    ...
    def save(self,*args,**kwargs):
        if some conditions:
           raise ValidationError()
        super().save(*args,**kwargs)

大佬总结

以上是大佬教程为你收集整理的Django:对于唯一性约束,如何将 null 视为等于所有内容?全部内容,希望文章能够帮你解决Django:对于唯一性约束,如何将 null 视为等于所有内容?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签:null如何将