【问题标题】:Update many-to-many field in django by fieldname通过字段名更新 django 中的多对多字段
【发布时间】: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


【解决方案1】:

链接问题中的给定答案不起作用,因为它已经九岁了,当时分配 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)

【讨论】:

  • 非常感谢。你节省了我很多时间。
猜你喜欢
  • 2012-01-11
  • 2016-12-17
  • 2010-11-14
  • 1970-01-01
  • 1970-01-01
  • 2012-12-01
  • 2018-06-07
  • 2015-07-18
  • 1970-01-01
相关资源
最近更新 更多