Ser*_*hez 0 python django many-to-many field-names
我正在使用 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)
Run Code Online (Sandbox Code Playgroud)
我从 api 收到一些新的事件数据,如下所示:
data = {
"name": "First Event",
"region": "4" # this is the ID of the region
}
Run Code Online (Sandbox Code Playgroud)
我正在尝试创建一个像这样的新事件:
Event.objects.create(**data)
Run Code Online (Sandbox Code Playgroud)
但我收到以下错误:
Direct assignment to the forward side of a many-to-many set is prohibited. Use region.set() instead.
Run Code Online (Sandbox Code Playgroud)
问题是我不能使用new_event.region.add(4)
Cause region
is a string,并且由于这是一个 API,因此该字段始终作为 json 键检索。
我读了这个问题/sf/ask/585260721/# =要求完全相同,但是给出的答案不起作用,因为当我写下:
new.__getattribute__(relation_name) = my_authors
Run Code Online (Sandbox Code Playgroud)
正如那里所建议的,我收到以下错误,这是有道理的:
SyntaxError: can't assign to function call
Run Code Online (Sandbox Code Playgroud)
那么如何通过 fieldName 添加多对多字段值呢?
链接问题中给出的答案不起作用,因为它已经有九年历史了,当时分配 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__
您可以将其简化为:
getattr(new_event, "region").add(4)
归档时间: |
|
查看次数: |
1234 次 |
最近记录: |