Когда поле ManyToMany сохраняется в базе данных? ⇐ Python
-
Anonymous
Когда поле ManyToMany сохраняется в базе данных?
Учитывая (упрощенную) модель, используемую в приложении администратора Django:
models.py
назначение класса(models.Model): клиент = модели.ForeignKey(Клиент, пустое значение = Ложь, ноль = Истина, on_delete = модели. CASCADE) пианино = модели.ManyToManyField(Пианино, пусто=True) def save(self, *args, **kwargs): # Это новая встреча, а не пересохраняемая существующая? newAppointment = self.id — нет пытаться: super().save(*args, **kwargs) # Вызов «настоящего» метода save(). если новоеВстреча: # Возвращает пустой набор запросов для фортепиано в self.pianos.all(): печать (фортепиано) кроме: проходить Я хочу получить доступ к «пианино». Если это вновь созданная встреча, self.pianos возвращается
и self.pianos.all() возвращают пустой набор запросов, хотя фортепиано отображаются в форме шаблона, которая была отправлена для инициации сохранения.
Однако, если это обновление существующей встречи, «пианино» возвращает данные, как и ожидалось.
Очевидно, что поле ManyToMany не сохраняется в базе данных сразу при вызове save(). Итак, как я могу получить доступ к данным, как показано ниже?
Я также попробовал альтернативный метод использования сигнала post_save, с точно таким же результатом:
@receiver(signals.post_save, sender=Встреча) Защиту createServiceHistory (отправитель, экземпляр, созданный, **kwargs): если создано: для фортепиано в экземпляре.pianos.all(): #empty queryset печать (фортепиано) В документации говорится, что поля ManyToMany сохраняются с помощью add(), а не save(), но я не понимаю, как это будет применяться в данном случае.
Учитывая (упрощенную) модель, используемую в приложении администратора Django:
models.py
назначение класса(models.Model): клиент = модели.ForeignKey(Клиент, пустое значение = Ложь, ноль = Истина, on_delete = модели. CASCADE) пианино = модели.ManyToManyField(Пианино, пусто=True) def save(self, *args, **kwargs): # Это новая встреча, а не пересохраняемая существующая? newAppointment = self.id — нет пытаться: super().save(*args, **kwargs) # Вызов «настоящего» метода save(). если новоеВстреча: # Возвращает пустой набор запросов для фортепиано в self.pianos.all(): печать (фортепиано) кроме: проходить Я хочу получить доступ к «пианино». Если это вновь созданная встреча, self.pianos возвращается
и self.pianos.all() возвращают пустой набор запросов, хотя фортепиано отображаются в форме шаблона, которая была отправлена для инициации сохранения.
Однако, если это обновление существующей встречи, «пианино» возвращает данные, как и ожидалось.
Очевидно, что поле ManyToMany не сохраняется в базе данных сразу при вызове save(). Итак, как я могу получить доступ к данным, как показано ниже?
Я также попробовал альтернативный метод использования сигнала post_save, с точно таким же результатом:
@receiver(signals.post_save, sender=Встреча) Защиту createServiceHistory (отправитель, экземпляр, созданный, **kwargs): если создано: для фортепиано в экземпляре.pianos.all(): #empty queryset печать (фортепиано) В документации говорится, что поля ManyToMany сохраняются с помощью add(), а не save(), но я не понимаю, как это будет применяться в данном случае.
Мобильная версия