Django Rest Framework模型post_save信号在post请求完成后执行

时间:2017-08-15 15:19:42

标签: python django aop django-signals

我有以下序列化程序:

class CreateOrderSerializer(OrderSerializer):
    class Meta(MetaOrder):
        fields = MetaOrder.fields + ('pair',)
        read_only_fields = MetaOrder.read_only_fields

    def create(self, validated_data):
        withdraw_address = validated_data.pop('withdraw_address')
        # Just making sure
        address = Address.objects.get(address=withdraw_address['address'])
        order = Order(**validated_data)
        if not address:
            address = Address(**withdraw_address)
            address.type = Address.WITHDRAW
            address.currency = order.pair.quote
            address.save()

        order.withdraw_address = address
        order.save()
        return order

以下ViewSet:

class OrderListViewSet(UserResourceViewSet, ReadOnlyCacheResponseAndETAGMixin):
    model_class = Order
    lookup_field = 'unique_reference'
    serializer_class = OrderSerializer
    pagination_class = OrderPagination

    def get_serializer_class(self):
        if self.request.method == 'POST':
            return CreateOrderSerializer

        return super(OrderListViewSet, self).get_serializer_class()

    def get_queryset(self, filters=None, **kwargs):
        self.queryset = Order.objects.all()
        return super(OrderListViewSet, self).get_queryset()

    def perform_create(self, serializer):
        if not self.request.user.is_authenticated:
            _create_anonymous_user(self.request)
        serializer.save(user=self.request.user)

        return super(OrderListViewSet, self).perform_create(serializer)

以及以下信号:

@receiver(post_save, dispatch_uid='allocate_wallets')
def allocate_wallets(sender, instance=None, created=False, **kwargs):
    if sender.__name__ not in ALLOWED_SENDERS:
        # Only run on users
        return
    if not created:
        return
    order = instance
    user = order.user
    currency = order.pair.quote
    if user is None:
        return
    if currency.disabled or not currency.is_crypto:
        return
    card, address = clients[currency.wallet].create_user_wallet(user, currency)
    order.deposit_address = address
    order.save()

我怀疑信号是在响应已经发送后执行的,因为我没有从POST请求中获取deposit_address字段([POST] / orders),但是我从详细视图中得到它( [GET] / orders /:id)。

可以采取哪些措施来解决这个问题?

0 个答案:

没有答案