首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >通过字段值限制Django ManyToMany

通过字段值限制Django ManyToMany
EN

Stack Overflow用户
提问于 2013-11-08 23:49:05
回答 2查看 1.5K关注 0票数 1

给定以下模型,如何将可以创建的计数关系的数量限制为键模型中的“ManyToMany”值?

例如,如果"count“是2,那么只有2个设备可以使用该密钥。

型号:

代码语言:javascript
复制
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)

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

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

EN

回答 2

Stack Overflow用户

发布于 2013-11-09 00:49:45

该功能没有内置到Django框架中,但是您可以在view方法中创建自己的过滤器。

例如,

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2013-11-09 22:04:35

您可以监听每次向密钥实例添加设备时发送的m2m_changed django signal

它看起来像这样:

代码语言:javascript
复制
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函数也会收到通知。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19863108

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档