我遇到一个问题,我必须从管理页面为给定用户存储两个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是唯一的。 有没有办法检查多个字段的唯一性?
谢谢!
答案 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)
个IpAddress
个user
永远不会超过两个(或任何业务要求)。
答案 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