-
from django.db import models
class KeyCategory(models.Model):
name = models.CharField(maxlength=255, unique=True)
class KeyGroup(models.Model):
name = models.CharField(maxlength=255)
cats = models.ManyToManyField(KeyCategory)#, blank=True, null=True)
keys = models.TextField(blank=True, default='', editable=False)
class Admin:
pass
from django.dispatch import dispatcher
from django.db.models import signals
def catgroup_save(instance):
import time
time.sleep(1)
print instance.cats.all()
dispatcher.connect(catgroup_save, signal=signals.post_save, sender=KeyGroup)Вот такой вот код. При добавлении объекта типа KeyGrup (с указанием нескольких элементов типа KeyCategory), print instance.cats.all() выводит пустой список.
Вопрос, как получить доступ к категориям (cats) внутри save() или обработчика сигнала post_save? Что-то уже совсем запарился ( -
Никак. В базе данных сначала сохраняется родительская запись, а уже потом только все связанные с ней, в том числе и ссылки в таблице между группами и категориями. Поймать их сохранение можно толко на более внешнем уровне — во view или форме, которая этот save() вызывает.
-
Получается через админку это нереально сделать? (
-
А что именно "это"? "Получить доступ к m2m полям сохраняющегося объекта" звучит скорее как часть варианта решения, а не как собственно задача.
-
Согласен. Ну тогда вопрос закрыт )
-
Нет, ну почему :-). Мне как раз интересно, что там в итоге-то сделать надо. Просто, если надо, скажем, считать количество присоединенных записей через M2M, то можно вместо того, чтобы считать его во время присоединения, просто сбрасывать в NULL, а считать во время обращения. Но это так, абстрактно очень...
-
Ну, закрыт в том плане, что "по простому" сделать нельзя, для чего я собственно и создавал тему Т.е. надо копаться внутри джанги.
О результатах копания отпишусь )
Вообще, мне надо не считать данные, а по полученным категориям (которые я никак получить не могу) выцепить из другой таблицы данные, которые тоже на категории ссылаются и записать эти данные в модель, которая вызывала post_save -
Понимаю... Я предлагаю вот такой подход:
То есть данные считать не во время save, а во время первого обращения.class KeyCategory(models.Model):
name = models.CharField(maxlength=255, unique=True)
class KeyGroup(models.Model):
name = models.CharField(maxlength=255)
cats = models.ManyToManyField(KeyCategory)
categories_dpendent_data = models.SomeField(null=True)
def key_categories_dependent_data(self):
if self.categories_dependent_data is None:
self.categories_dependent_data = # как-то посчитать
return self.categories_dependent_data
def save(self):
self.categories_dependent_data = None
super(KeyGroup, self).save() -
Хм, дошли руки, ноги до заброшенного проекта с этой закавыкой.
Вот сейчас нашёл в django users обсуждение проблемы: http://groups.google.com/group/django-users/browse_thread/thread/99680b69d2d4799c/07093d3695163269?lnk=gst&q=many+to+many+save&rnum=3#07093d3695163269
Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.
