Как я могу получить доступ к 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"):
.