按字段值限制Django ManyToMany

时间:2013-11-08 15:49:05

标签: django django-models

鉴于以下模型,如何在Key模型中将可以创建的ManyToMany关系的数量限制为“count”的值?

例如,如果“count”为2,则只有2个设备可以使用该密钥。

型号:

class Device(models.Model):
    name = models.CharField(max_length=100, unique=True)

class Key(models.Model):
    key = models.CharField(max_length=100, unique=True)
    count = models.IntegerField(default=1)
    device = models.ManyToManyField(Device, blank=True, null=True)

如果用户尝试将密钥添加到太多设备,或者将“count”减少到小于已使用密钥的设备数量,则需要引发异常。设备可以有任意数量的密钥。

(我正在使用管理站点进行数据输入)

2 个答案:

答案 0 :(得分:1)

此功能未内置于Django框架中,但您可以在view方法中创建自己的过滤器。

例如,

MAXKEYS = 3

def addNewKey(request):
  if request.user.is_authenticated():
    deviceRequest = Device.objects.get(pk = request.GET["deviceId"])
    keys = Key.objects.filter(device = deviceRequest)

    if len(keys) < MAXKEYS:
      #add new key reference
    else:
      #return an error or something

  else:
    #return user is not authenticated error message

答案 1 :(得分:1)

您可以收听每次将设备添加到Key实例时发送的m2m_changed django signal

看起来像这样:

def device_added(sender, **kwargs):
     print "action == %s"%kwargs['action'] # You should intercept when action is 'pre_add'
     print "keyInstanceCount == %s"%kwargs['instance'].count # this is where you can check the current count field and raise your exception if it is exceeding the limit

m2m_changed.connect(device_added, sender=Key.device.through)

m2m_changed连接到device_added后,每次将设备添加到密钥实例device_added时,系统都会收到通知。