Можете ли вы инициировать сигнал при частичном обновлении объекта django через django каркас отдыха? - PullRequest
3 голосов
/ 28 апреля 2020

Я начал замечать, что метод patch в django каркасе отдыха на самом деле не вызывает сигналы, методы post, кажется, работают нормально. Это то, что у меня есть:

@receiver(signals.pre_save, sender=Example)
def populate_time_fields_based_on_state(sender, **kwargs):
    example = kwargs.get('instance')
    if example.start_datetime is None and example.projected_end_datetime is None and example.state.label == 'Assigned':
        example.start_datetime = datetime.datetime.now()
        example.projected_end_datetime = example.created_datetime + datetime.timedelta(
            days=example.som_field)
        example.save()

И я проверяю это с помощью:

client = APIClient()
client.patch(f'/api/example/1/', {'state': 'Assigned'})

Есть ли способ сказать ему, чтобы вызвать сигнал? Нужно ли переопределить метод обновления в моем сериализаторе? Я пытаюсь это:

def partial_update(self, request, *args, **kwargs):
    response = super().partial_update(request, *args, **kwargs)
    instance = self.get_object()
    instance.save()
    return response

Но это довольно нахально

1 Ответ

1 голос
/ 29 апреля 2020

В каталоге вашего приложения должно быть apps.py, , см. Документацию для формата .

Обычно это выглядит следующим образом, в отличие от примера, когда они подключают сигнал вручную. Обратите внимание, что у меня здесь есть структура "project / apps /", но я просто изменяю имя модуля в зависимости от того, где на самом деле находятся файлы:

#project/apps/my_app/__init__.py
default_app_config = 'project.apps.my_app.apps.MyAppConfig'

#project/apps/my_app/apps.py
from django.apps import AppConfig

class MyAppConfig(AppConfig):
    name = "project.apps.my_app"
    verbose_name = "MyApp"

    def ready(self):
        from project.apps.my_app import signals
        # ... other init &/or logging

Примечание: Не стесняйтесь удалять строки в init .py и играйте с name в конфигурации приложения. Я не уверен, насколько критичны они на самом деле

...