Как я могу получить доступ к request.data внутри сигнала post_save после создания объектов модели

Я хочу создавать проекты с документами

Но это занимает время, поэтому я хочу добавить документ после создания проектов

Но я указываю детали, связанные с документами, в теле запроса

# Define the signal receiver function
@receiver(post_save, sender=Project)
def attach_documents_to_project(sender, instance, created, **kwargs):
    if created:
        attachments_data = instance.request.data.get('document')

You don't. signals, just like models are request unaware. This is a core design feature of most model-view-viewmodel (MVVM) architectures. In fact it is not even said that there is a request involved. You could also create or update or remove records with a management command [Django-doc].

These are all reasons not to use signals [django-antipatterns] in the first place. If something is request-oriented, it belongs in a view, not in the model layer, where signals essentially reside. You can define a helper function that you then invoke in view(s) where you want to trigger this logic.


раскрытие: я являюсь автором этой статьи.

Вы можете установить атрибут _request для instance перед вызовом метода сохранения и получить доступ к этому атрибуту в методе приемника.

Внутри views.py/serializers.py:

instance._request = request
instance.save()

Метод внутреннего приемника:

@receiver(post_save, sender=Project)
def attach_documents_to_project(sender, instance, created, **kwargs):
    if created:
        try:
            attachments_data = instance._request.data.get('document')
        except AttributeError:
            pass

Обязательно оберните утверждение между try/except или поместите его под if hasattr(instance, "_request"):.

Вернуться на верх