Django检查两个字段之间的唯一字段条目

时间:2015-04-27 10:18:37

标签: python django python-2.7 django-models

我遇到一个问题,我必须从管理页面为给定用户存储两个IP字段。 我的用户模型定义如下:

class userIPs(models.Model):
   IP_Address_1 = models.GenericIPAddressField(blank=False)
   IP_Address_2 = models.GenericIPAddressField(blank=False)
   class Meta:
     unique_together = (('IP_Address_1', 'IP_Address_2',),)

OR

IP_Address_1 = models.GenericIPAddressField(blank=False, unique = True)
IP_Address_2 = models.GenericIPAddressField(blank=False, unique = True)

使用任一实现,我只能检查一个特定IP字段的唯一性。

例如:如果user1具有以下值,

  

IP_Address_1 = 10.0.0.1; IP_Address_2 = 10.0.0.2

如果我尝试添加相同的值,系统会按预期引发异常。 但是,当我尝试添加其他用户值时,如

  

IP_Address_1 = 10.0.0.2; IP_Address_2 = 10.0.0.1

添加的值没有任何唯一的检查。

我想通过检查IP_Address_1和IP_Address_2来确保IP是唯一的。 有没有办法检查多个字段的唯一性?

谢谢!

3 个答案:

答案 0 :(得分:0)

  

有没有办法检查多个字段的唯一性?

您可以更新模型的save方法,以检查两个IP是否都是唯一的。

类似的东西:

def save(self, *args, **kwargs):
    if not (userIPs.objects.filter(IP_Address_1=self.IP_Address_1).exists() and userIPs.objects.filter(IP_Address_2=self.IP_Address_2).exists())
        super(Model, self).save(*args, **kwargs)
    else:
        print "IP not unique"

答案 1 :(得分:0)

除非"命令"这两个IP地址很重要,只需在$scope.last_good_configuration = angular.copy($scope.storage); 中对它们进行排序,然后信任您的数据库。

save()

编辑:

符合要求

  

我希望IP地址对所有用户都是唯一的。即,如果user1具有IP1,IP2,则用户2必须具有IP3,IP4等等

重构更好:

def save(self, *args, **kwargs):
    self.ip1, self.ip2 = sorted((self.ip1, self.ip2))
    return super(UserIps, self).save(*args, **kwargs)

并确保每class IpAddress(models.Model): user = models.ForeignKey(User) ip = models.GenericIpAddressField(unique=True) IpAddressuser永远不会超过两个(或任何业务要​​求)。

答案 2 :(得分:0)

请注意:我是问这个问题的人。认为答案可能对某人有用。

要验证两个不同字段中的值,我们可以使用:

  

1)“uniue = True”表示同一领域的唯一性

  

2)def clean(self,* args,** kwargs):用于验证其他字段的函数。

所以,我的最终模型如下

class userIPs(models.Model):
   IP_Address_1 = models.GenericIPAddressField(blank=False, unique = True)
   IP_Address_2 = models.GenericIPAddressField(blank=False, unique = True)

   def clean(self, *args, **kwargs):
       if (userIPs.objects.filter(IP_Address_2=self.IP_Address_1).exists()):
           raise ValidationError('IP Address 1 value already exists.')
       elif (userIPs.objects.filter(IP_Address_1=self.IP_Address_2).exists()):
           raise ValidationError('IP Address 2 value already exists.')
       else:
           super(userIPs, self).clean(*args, **kwargs)

   def __unicode__(self):
       return self.user.username