Несколько сигналов post_save, вызывающих проблемы с переведенной моделью - PullRequest
0 голосов
/ 04 ноября 2011

В настоящее время я работаю с django-nani, чтобы включить переведенные модели в проекте.

Многие из этих моделей требуют слагов для генерации URL. Мой клиент нетехнический, и просить его ввести слизняков было бы неразумно с точки зрения как ожиданий, так и затрат на поддержку. Перевод - это новое требование, поэтому я работаю над корректировкой старых моделей для перевода.

При сохранении модели nani регистрирует сигнал post_save с целью сохранения переводов. Это нормально, за исключением того, что теперь, если я попытаюсь зарегистрировать сигнал post_save, чтобы использовать указанные переводы для генерации слагов, мне не повезло; либо мой сигнал выполняется после, либо одновременно, и не существует никакого объекта перевода.

Код модели обидчика:

from django.db import models
from django.db.models import signals
from django.template.defaultfilters import slugify

from tinymce.models import HTMLField
from nani.models import TranslatableModel, TranslatedFields

class Product(TranslatableModel):
    translations = TranslatedFields(
        name = models.CharField(max_length=100),
        title = models.CharField(max_length=100),
        description = HTMLField(),
    )

    slug = models.SlugField(max_length=100, blank=True, null=True, editable=False),

    # Various unrelated fields...

    def __unicode__(self):
        return self.translations.get(language_code='en').name

def product_post_save(sender, instance, created, **kwargs):
    new_slug = slugify(instance.translations.get(language_code='en').name)

    if instance.slug != new_slug:
        instance.slug = new_slug
        instance.save()
signals.post_save.connect(product_post_save, Product)

Это приводит к тому, что Запрос на сопоставление ProductTranslation не существует В первой строке product_post_save исключение IsNotExist.

Я кратко попытался провести рефакторинг nani, чтобы переопределить метод save вместо использования post_save, но это кажется нетривиальной задачей (по крайней мере для тех, кто мало знает о его внутренностях, таких как я).

Я смотрел на некоторые сторонние поля автозапуска, но я не могу представить, что они будут работать с этой конкретной ситуацией и библиотекой перевода.

Мои вопросы будут ...

  • Есть ли способ убедиться, что одно post_save выстроено в линию после любого другие, которые определены?
  • За исключением этого, может кто-нибудь еще предложить другое / лучшее решение этой проблемы?

Редактировать: Обнаружен приоритет сигнала, предложенный разработчиками ядра Django.

1 Ответ

0 голосов
/ 07 ноября 2011

Поскольку команда Django решила не поддерживать порядок для методов, зарегистрированных на хуках, а Nani реализует сохранение с использованием их перевода, я не нашел четкого способа убедиться, что мой код работает после методов nani post_save.

В конце концов, я разветвил Nani и добавил собственный сигнал, который срабатывает, когда заканчивается post_save. Это не идеально (на мой взгляд), но работает.

...