0

我正在使用 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 添加多对多字段值呢?

4

1 回答 1

4

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

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

new_event.region.set(4)

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

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

因为你真正想做的是:

```new_event.region = 4`

这当然行不通。

但是其余的代码应该没问题(即__getattribute__部分)。所以你需要做的是调用set/add什么__getattribute__返回的方法。IE

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

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

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

于 2020-03-31T15:33:00.493 回答