【问题标题】:Limit a Django ManyToMany by field value通过字段值限制 Django ManyToMany
【发布时间】:2013-11-08 15:49:05
【问题描述】:

鉴于以下模型,如何将可创建的 ManyToMany 关系的数量限制为 Key 模型中的“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)

如果用户尝试将密钥添加到太多设备,或者如果他们将“计数”减少到少于已经使用该密钥的设备数量,我需要引发异常。一个设备可以有任意数量的键。

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

【问题讨论】:

    标签: django django-models


    【解决方案1】:

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

    例如,

    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
    

    【讨论】:

    【解决方案2】:

    您可以收听每次将设备添加到 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 函数也会收到通知。

    【讨论】:

    • 我已经让这部分工作了,它在浏览器中显示了异常。是否有一种标准方法可以使其显示错误消息并防止该项目被保存?我应该提出某种特定类型的异常吗?
    • 试试this 回答。我认为它试图解决与您的问题几乎相同的问题。您可能根本不需要使用信号。只需覆盖 through 类 (KeyDevice) 即可解决问题。
    猜你喜欢
    • 2021-06-07
    • 2021-10-18
    • 2018-06-09
    • 2011-12-21
    • 1970-01-01
    • 1970-01-01
    • 2013-04-22
    • 1970-01-01
    • 2014-05-27
    相关资源
    最近更新 更多