【问题标题】:django bulk remove and add many to many relationshipsdjango 批量删除并添加多对多关系
【发布时间】:2016-03-20 08:59:48
【问题描述】:

我在删除和添加批量多对多关系时遇到问题。

这是发送要更新的用户的pk和将要添加到多对多的技能的pk的JS。

function attachskillls(){

var checkedValues = $('input:checkbox:checked').map(function() {
  return this.value;
}).get();

console.log(checkedValues)

data = {
  'skills' : checkedValues,
  'pk' : getUrlVars()["id"]
}
console.log(data)

$.ajax({
  type: "POST",
  url: "/api/skill/attch/",
  data: JSON.stringify(data),
  contentType: "application/json",
  dataType: "json"
})

数据是这样打包的

{"skills":["1","2","3"],"pk":"1"}

这是与技能相关的模型

class Resource(models.Model):

    title = models.CharField(max_length=10)
    preferred_name = models.CharField(max_length=20)
    last_name = models.CharField(max_length=30)
    employstatus = models.CharField(max_length=20)
    employer = models.ForeignKey('Employer')
    role = models.ForeignKey('Role')
    location = models.ForeignKey('Location')
    workphone = models.CharField(max_length=25, blank=True, null=True)
    mobile_phone = models.CharField(max_length=15, blank=True, null=True)
    email = models.CharField(max_length=15, blank=True, null=True)
    notes = models.CharField(max_length=200, blank=True, null=True)
    updated_by = models.CharField(max_length=30, blank=True, null=True)
    skillset = models.ManyToManyField('ReferenceSkillList')

到目前为止,这是我的 api,我正在尝试按 pk 过滤资源,因此我有正确的用户来添加技能,然后清除所有可能已经添加的关系,然后批量添加新的关系。

def Skillattachment(request):
    body = json.loads(request.body)
    if request.method == "POST":
        pk = body['pk']
        skills = body
        res = Resource.objects.filter(pk=pk)
        res.skillset.clear()
        res.skillset.add(skills)

    else:
        search_id = ''

    return HttpResponse(json.dumps(body), content_type='application/json')

有没有更好的方法来做我想做的事情?

我目前收到错误 'QuerySet' 对象没有属性 'skillset' 虽然我不确定为什么?也许我错误地制作了 M2M,但我遵循了文档

【问题讨论】:

  • 一般来说,语句的末尾应该有分号

标签: javascript python ajax django


【解决方案1】:

您应该改用res = Resource.objects.get(pk=pk)filter 会给你一个查询集作为结果。

你的变量skills 只是一个数据结构而不是对象。您可能需要:

skills = ReferenceSkillList.objects.filter(id__in=body['skills'])
res = Resource.objects.get(pk=pk)
res.skillset.clear()
res.skillset.add(*skills)

Django docs.

【讨论】:

  • 我不希望它是一个 id 列表,因为这些 id 是我想要附加的技能的 pks 吗?我对此很陌生,但我正在尝试伸展,我现在确实得到 int() 参数的错误必须是字符串或数字,而不是 'QuerySet' 是 QuerySet 而不仅仅是另一种类型的列表跨度>
  • 对不起,我编辑了答案。这是*skills。看看这个 SO 问答:stackoverflow.com/questions/4979542/…
  • 天哪,如果我能吻你,我会的。我不认为我会获得技能 = ReferenceSkillList.objects.filter(id__in=body['skills']) 非常感谢你,如果我能更多地投票给你,我会的,我在 SO 上遇到的最有帮助的人到目前为止。
  • 感谢@ShangWang 这个答案仍然适用于 Django 2.1.5。将skills = ...filter(...) 行替换为skills = ...bulk_create(...),这样我就可以创建多个项目,然后将它们添加到manytomany 字段中。 (*skills) 是重点。哈哈
  • 是否可以在没有两次数据库命中的情况下做到这一点? (clear() 和 add()/set())
猜你喜欢
  • 2015-08-22
  • 1970-01-01
  • 2012-06-06
  • 2013-06-17
  • 2018-04-04
  • 2011-09-14
  • 1970-01-01
  • 1970-01-01
  • 2013-06-01
相关资源
最近更新 更多