首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用字段名更新django中的多到多字段

用字段名更新django中的多到多字段
EN

Stack Overflow用户
提问于 2020-03-31 12:26:46
回答 1查看 1K关注 0票数 0

我正在使用Django构建一个API,它允许外部应用程序向我的API发送帖子,然后将接收到的数据插入到我的数据库中。

以下是我的简化模型:

代码语言:javascript
运行
复制
class Region(models.Model):
    name = models.CharField(max_length=250)

class Event(models.Model):
    name = models.CharField(max_length=250)
    region = models.ManyToManyField(Region)

我从api中收到一些新的事件数据,如下所示:

代码语言:javascript
运行
复制
data = {
    "name": "First Event",
    "region": "4"  # this is the ID of the region
}

我正在尝试创建这样一个新的事件:

代码语言:javascript
运行
复制
Event.objects.create(**data)

但我得到了以下错误:

代码语言:javascript
运行
复制
Direct assignment to the forward side of a many-to-many set is prohibited. Use region.set() instead. 

问题是我不能使用new_event.region.add(4),因为region是一个字符串,因为这是一个API,所以字段总是作为一个json键被检索。

我阅读了这个问题https://stackoverflow.com/questions/8360867/update-many-to-many-field-in-django-with-field-name-in-variable#,它问的完全一样,但给出的答案是不起作用的原因,当我写:

代码语言:javascript
运行
复制
new.__getattribute__(relation_name) = my_authors

正如建议的那样,我得到了以下错误,这是有意义的:

代码语言:javascript
运行
复制
SyntaxError: can't assign to function call

那么,如何通过manytoMany添加一个fieldName字段值呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-03-31 15:33:00

在链接问题中给出的答案不起作用,因为它已经有9年历史了,然后分配m2m字段过去是这样的:new_event.region = [4]

然而,这在很久以前就被废弃了,现在语法是:

new_event.region.set(4)

这正是您得到以下错误的原因:

禁止将

直接分配到多对多集合的前侧.使用region.set()代替。

因为你实际上想做的是:

`new_event.region =4‘

这当然行不通。

但是,代码的其余部分应该很好(即__getattribute__部分)。因此,您需要做的是调用__getattribute__返回的内容的__getattribute__方法。即

new_event.__getattribute__("region").add(4)

但是,不必使用__getattribute__ dunder方法,可以将其简化为:

getattr(new_event, "region").add(4)

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

https://stackoverflow.com/questions/60950544

复制
相关文章

相似问题

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