удалить запись из другой модели по действию выберите в админке Django - PullRequest
0 голосов
/ 03 мая 2018

Я использую Django 2.0

Я создал несколько actions для использования в admin интерфейсе

def clear_arbitrase(modeladmin, request, queryset):
    queryset.update(arbitrase_generated=False)


@admin.register(WallmartRecord)
class WallmartRecordAdmin(admin.ModelAdmin):
    actions = [
        clear_arbitrase
    ]

Это обновляет флаг arbitrase_generated до False для WallmartRecord модели.

У меня есть другая таблица для сохранения записи arbitrase в ArbitraseRecord

Я хочу также удалить запись из ArbitraseRecord при пометке arbitrase_generated в False.

Я пытался реализовать сигнал post_save в models.py

@receiver(post_save, sender=WallmartRecord)
def post_save_wallmart_record_receiver(sender, instance, *args, **kwargs):
    if not instance.arbitrase_generated:
        # delete records from ArbitraseRecord
        arbitrase_record = ArbitraseRecord.objects.filter(wallmart_record=instance)
        if arbitrase_record is not None:
            for record in arbitrase_record:
                record.delete()

Но, похоже, это не вызов получателя.

Как удалить запись из другой модели при выборе действия администратора?

1 Ответ

0 голосов
/ 03 мая 2018

update() работает непосредственно на уровне SQL и не вызывает модель save(), поэтому сигнал post_save в вашем случае не сработает. Вы можете переместить удаление в clear_arbitrase следующим образом:

def clear_arbitrase(modeladmin, request, queryset):
    queryset.update(arbitrase_generated=False)
    ArbitraseRecord.objects.filter(wallmart_record__id__in=queryset.values_list('id', flat=True)).delete()
...