通过fieldname更新django中的多对多字段



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

以下是我的简化模型:

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收到一些新的事件数据,如下所示:

data = {
"name": "First Event",
"region": "4"  # this is the ID of the region
}

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

Event.objects.create(**data)

但我得到以下错误:

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#=这是完全相同的问题,但给出的答案不起作用,因为当我写:

new.__getattribute__(relation_name) = my_authors

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

SyntaxError: can't assign to function call

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

链接问题中给出的答案不起作用,因为它已经九年了,当时分配m2m字段的方式是这样的:new_event.region = [4]

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

new_event.region.set(4)

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

禁止直接分配给多对多集合的前端。请改用region.set((。`

因为你实际上想做的是:

```new_event.region=4`

当然这是行不通的。

然而,代码的其余部分应该是好的(即__getattribute__部分(。因此,您需要调用__getattribute__返回的set/add方法。即

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

但是,您可以将其简化为:,而不是使用__getattribute__dunder方法

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

相关内容

  • 没有找到相关文章

最新更新