Обновление поля «многие ко многим» в django по имени поля - PullRequest
0 голосов
/ 31 марта 2020

Я создаю API с Django, который позволяет внешнему приложению отправлять сообщения в мой 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

Так как я могу добавить значение поля manytoMany по fieldName?

1 Ответ

1 голос
/ 31 марта 2020

Данный ответ в связанном вопросе не работает, потому что ему девять лет, и тогда присвоение поля m2m было таким: new_event.region = [4]

Однако это долгое время считалось устаревшим a go, и теперь синтаксис:

new_event.region.set(4)

, именно поэтому вы получаете следующую ошибку:

Прямое назначение передней стороне многих Набор для многих запрещен. Вместо этого используйте region.set ().

Потому что на самом деле вы пытаетесь сделать следующее:

`` `new_event.region = 4`

Of Конечно, это не сработает.

Однако остальная часть кода должна быть в порядке (т.е. часть __getattribute__). Поэтому вам нужно вызвать метод set/add, который возвращает __getattribute__. то есть

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

, но вместо использования метода __getattribute__ вы можете упростить его до:

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

...