【发布时间】:2020-03-31 12:26:46
【问题描述】:
我正在使用 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 添加多对多字段值?
【问题讨论】:
-
即使您对其进行 mokey 修补,您的方法也不起作用,它不能在单个语句中发生,至少需要两个 - 1 用于创建实例,2 用于附加 m2m 字段。我建议看看DRF 并使用Serializers 来实现你想要的。
-
@Todor 它可以工作。检查我的答案
-
@Todor 我不需要在 1 条语句中执行,我只需要让它工作。我已经在使用 DRF,但序列化程序不允许我通过字段名更新 many2many 关系
-
如果您使用 DRF,可能会显示您的代码,显示序列化程序等。您正在编写的内容毫无意义:“”“问题是我无法使用 new_event.region.add( 4) 因为 region 是一个字符串,并且由于这是一个 API,所以该字段总是作为 json 键检索。""" 1) 如果
new_event是一个模型,我看不出region是一个字符串在这里实例。 2) JSON 不仅支持字符串,还支持整数。 3)new_event.region.add(4)即使 4 是一个字符串也应该可以工作,但它也可以转换为 int。 -
你试过简单的:
getattr(new_event, "region").add(4)
标签: python django many-to-many field-names