03.09.2007 23:49

  1. lorien

    0 ↑
    0 ↓
    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? Что-то уже совсем запарился (
  2. Никак. В базе данных сначала сохраняется родительская запись, а уже потом только все связанные с ней, в том числе и ссылки в таблице между группами и категориями. Поймать их сохранение можно толко на более внешнем уровне — во view или форме, которая этот save() вызывает.
  3. lorien

    0 ↑
    0 ↓
    Получается через админку это нереально сделать? (
  4. А что именно "это"? "Получить доступ к m2m полям сохраняющегося объекта" звучит скорее как часть варианта решения, а не как собственно задача.
  5. lorien

    0 ↑
    0 ↓
    Согласен. Ну тогда вопрос закрыт )
  6. Нет, ну почему :-). Мне как раз интересно, что там в итоге-то сделать надо. Просто, если надо, скажем, считать количество присоединенных записей через M2M, то можно вместо того, чтобы считать его во время присоединения, просто сбрасывать в NULL, а считать во время обращения. Но это так, абстрактно очень...
  7. lorien

    0 ↑
    0 ↓
    Ну, закрыт в том плане, что "по простому" сделать нельзя, для чего я собственно и создавал тему Т.е. надо копаться внутри джанги.
    О результатах копания отпишусь )
    Вообще, мне надо не считать данные, а по полученным категориям (которые я никак получить не могу) выцепить из другой таблицы данные, которые тоже на категории ссылаются и записать эти данные в модель, которая вызывала post_save
  8. Понимаю... Я предлагаю вот такой подход:
    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()
    То есть данные считать не во время save, а во время первого обращения.
  9. lorien

    0 ↑
    0 ↓
    Хм, дошли руки, ноги до заброшенного проекта с этой закавыкой.
    Вот сейчас нашёл в django users обсуждение проблемы: http://groups.google.com/group/django-users/browse_thread/thread/99680b69d2d4799c/07093d3695163269?lnk=gst&q=many+to+many+save&rnum=3#07093d3695163269

Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.