通过字段名更新django中的多对多字段
Update many-to-many field in django by fieldname
我正在使用 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键。
我读了这个问题,它问的完全一样,但是给定的答案不起作用,因为我写的时候:
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)
这正是您收到以下错误的原因:
Direct assignment to the forward side of a many-to-many set is prohibited. Use region.set() instead.`
因为你实际上想做的是:
```new_event.region = 4`
这当然不行。
但是其余代码应该没问题(即 __getattribute__
部分)。
所以你需要做的就是调用什么__getattribute__
returns的set/add
方法。即
new_event.__getattribute__("region").add(4)
但不使用 __getattribute__
dunder 方法,您可以将其简化为:
getattr(new_event, "region").add(4)
我正在使用 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键。
我读了这个问题,它问的完全一样,但是给定的答案不起作用,因为我写的时候:
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)
这正是您收到以下错误的原因:
Direct assignment to the forward side of a many-to-many set is prohibited. Use region.set() instead.`
因为你实际上想做的是:
```new_event.region = 4`
这当然不行。
但是其余代码应该没问题(即 __getattribute__
部分)。
所以你需要做的就是调用什么__getattribute__
returns的set/add
方法。即
new_event.__getattribute__("region").add(4)
但不使用 __getattribute__
dunder 方法,您可以将其简化为:
getattr(new_event, "region").add(4)