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

2024-04-25 08:26:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个问题,我必须从管理页面为一个给定的用户存储两个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',),)

或者

^{pr2}$

使用这两种实现,我只能检查一个特定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地址1和IP地址2来确保IP是唯一的。 有没有办法检查多个字段的唯一性?在

谢谢!在


Tags: 用户模型ipfalsemodel定义addressmodels
3条回答

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

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

1) "uniue=True" for uniqueness in the same field

以及

2) def clean(self, *args, **kwargs): function to validate against other field.

所以,我最后的模型如下

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

Is there a way to check multiple fields for uniqueness?

您可以为您的模型更新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"

除非这两个IP地址的“顺序”很重要,否则只需在您的save()中对它们进行排序,其余的则信任您的数据库。在

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

编辑:

为了满足要求

I want the IP address to be unique for all the users. i.e., If user1 has IP1, IP2, then user 2 must have IP3, IP4 and so on

最好重构:

^{pr2}$

并确保每个user最多有两个(或您的业务需求是什么)IpAddress。在

相关问题 更多 >

    热门问题