Django |在Q对象的左操作数为models的地方创建检查约束

问题描述

我有以下模型:

class IpBlacklist(models.Model):
  
    ip = GenericIPAddressField(
        verbose_name='Ip address.',db_index=True,primary_key=True,unpack_ipv4=True,validators=[admin_validators.ValidateIpAddressOrNetwork(24),]
    )

我想创建检查约束,以限制ipv4和ipv6网络上的网络掩码。

在RAW SQL中,它看起来像:

alter table ipcheck add constraint netmask_bits_check check 
  (   (family(ip) = 4 and masklen(ip) between 24 and 32) 
   or (family(ip) = 6 and masklen(ip) between 120 and 129)); 

我试图通过Meta中的Check约束来做到这一点:

models.CheckConstraint(
    name='netmask_check',check=models.Q(
        models.Q(
            models.Func(models.F('ip'),function='FAMILY') == 4,models.Func(models.F('ip'),function='MASKLEN') in range(24,33)
        ) |
        models.Q(
            models.Func(models.F('ip'),function='FAMILY') == 6,function='MASKLEN') in range(120,128)
        )
    )
)

基本上,这只是一个伪代码,因为我不知道如何正确编写它。问题是我将Func()作为左操作数,因为我不能使用所有的'__gt' ,“ __ in”等

任何想法如何在不进行自定义迁移和自定义转换的情况下做到这一点?

谢谢!

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)