У меня есть блоговое приложение с историями и категориями:
class Category(models.Model):
...
class Story(models.Model):
categories = models.ManyToManyField(Category)
...
Теперь я знаю, что при сохранении нового экземпляра модели с полем «многие ко многим» возникают проблемы, поскольку объект еще не находится в базе данных. Эта проблема обычно проявляется при отправке формы, которую можно аккуратно обойти с помощью story_form.save(commit=False)
. А как насчет ситуации, когда нет форм, о которых можно говорить? В моем случае я хочу создать API для приема удаленных заявок. Поскольку мне нравится JSON, и многие другие сообщения в нашей компании находятся в JSON (включая исходящие сообщения с этого сервера), я бы хотел получить следующее:
{ "operation": "INSERT",
"values": [
{ "datatype": "story",
"categories": [4,6,8],
"id":50,
...
}
]
}
и реализовать фабрику, которая преобразует значения в экземпляры. Но я бы хотел, чтобы фабрика была максимально агностичной к типу операций. Итак:
{ "operation": "UPDATE",
"values": [
{ "datatype": "story",
"categories": [4,6,8],
"id":50,
...
}
]
}
также должен быть преобразован таким же образом, за исключением того, что INSERT игнорирует id, а UPDATE получает уже существующий экземпляр и переопределяет его. (Удаленный отправитель прослушивает фид, который, помимо прочего, дает ему объекты категории для кэширования, поэтому он может и должен ссылаться на них по id, но он не имеет прямой связи с базой данных.)
Мой реальный вопрос: что проще всего сделать, чтобы надувать экземпляр объекта модели Django, к которому подключен ManyToManyManager. Насколько я понимаю, любая вставка объекта с полем «многие ко многим» потребует двух попаданий в базу данных, просто потому, что сначала необходимо получить новый идентификатор. Но мое нынешнее неловкое решение - сохранить объект сразу и пометить его как скрытый, чтобы функции в дальнейшем могли поиграть с ним и сохранить его как нечто более значимое. Похоже, что на один шаг вверх будет переопределено save
, чтобы объекты без идентификаторов сохранялись один раз, копировали какое-либо поле прокси в categories
, а затем сохраняли снова. Лучше всего будет какой-нибудь надежный объект менеджера, который избавит меня от проблем. Что вы рекомендуете?