Skip to main content

Django Integration Guide

This guide explains how to integrate Payments v2.0 models into your Django application, including payment creation, balance tracking, and withdrawal management.

Database Models (ORM)

Payments v2.0 provides 5 core models that you can use directly in your Django application:

Model Overview

from django_cfg.apps.payments.models import (
Payment, # Cryptocurrency deposit records
Currency, # Supported payment currencies
UserBalance, # User balance tracking
Transaction, # Immutable transaction history
WithdrawalRequest # Manual withdrawal requests
)

Model Relationships:

  • Payment → references Currency (ForeignKey) and User
  • UserBalance → one-to-one with User
  • Transaction → references User (many transactions per user)
  • WithdrawalRequest → references Currency and User
  • All models use standard Django ORM

Key Features:

  • Standard Django Models - Use familiar ORM patterns
  • No Custom Signals - v2.0 simplifies by removing signal complexity
  • Direct Database Access - Query with standard Django ORM
  • Type-Safe - Full type hints and validation

Payment Model

Cryptocurrency deposit records via NowPayments:

from django_cfg.apps.payments.models import Payment, Currency
from decimal import Decimal

# Create a payment
payment = Payment.objects.create(
user=user,
amount_usd=Decimal('99.99'),
currency=Currency.objects.get(code='USDTTRC20'),
description='Premium subscription deposit'
)

# Access payment properties
print(payment.internal_payment_id) # PAY_20250114123456_abc12345
print(payment.status) # 'pending'
print(payment.amount_display) # '$99.99 USD'
print(payment.is_pending) # True
print(payment.qr_data) # Payment address for QR code
print(payment.get_explorer_link()) # Blockchain explorer URL

# Update status manually
payment.status = Payment.PaymentStatus.COMPLETED
payment.completed_at = timezone.now()
payment.save()

Payment Model Fields:

  • user - User who created the payment
  • internal_payment_id - Unique payment identifier (auto-generated)
  • amount_usd - Payment amount in USD (Decimal)
  • currency - ForeignKey to Currency model
  • pay_amount - Amount in cryptocurrency (Decimal)
  • provider - Always 'nowpayments' in v2.0
  • provider_payment_id - NowPayments payment ID
  • status - Payment status (pending, confirming, completed, etc.)
  • pay_address - Cryptocurrency payment address
  • transaction_hash - Blockchain transaction hash
  • description - Payment description

Currency Model

Supported payment currencies with token and network information:

from django_cfg.apps.payments.models import Currency

# Get active currencies
currencies = Currency.objects.filter(is_active=True)

# Get specific currency
usdt = Currency.objects.get(code='USDTTRC20')
print(usdt.display_name) # "USDT (TRC20)"
print(usdt.token) # "USDT"
print(usdt.network) # "TRC20"
print(usdt.min_amount_usd) # Decimal('1.00')

# Check currency properties
print(usdt.is_active) # True
print(usdt.provider) # 'nowpayments'

Currency Model Fields:

  • code - NowPayments currency code (e.g., USDTTRC20, BTC)
  • name - Full currency name
  • token - Token symbol (e.g., USDT, BTC)
  • network - Network name (e.g., TRC20, ERC20, Bitcoin)
  • decimal_places - Decimal precision for amounts
  • is_active - Whether currency is available for payments
  • provider - Always 'nowpayments' in v2.0
  • min_amount_usd - Minimum payment amount
  • sort_order - Display order in lists

UserBalance Model

User balance tracking with ORM-based calculation:

from django_cfg.apps.payments.models import UserBalance

# Get or create user balance
balance = UserBalance.objects.get_or_create_for_user(user)

# Access balance information
print(balance.balance_display) # '$199.99 USD'
print(balance.balance_usd) # Decimal('199.99')
print(balance.total_deposited) # Decimal('250.00')
print(balance.total_withdrawn) # Decimal('50.00')
print(balance.last_transaction_at) # datetime

# Balance properties
print(balance.is_empty) # False
print(balance.has_transactions) # True

# Balance is calculated from Transaction records
# balance_usd = SUM(Transaction.amount_usd WHERE user=user)

UserBalance Model Fields:

  • user - OneToOneField to User
  • balance_usd - Current balance (Decimal, computed from transactions)
  • total_deposited - Lifetime total deposits
  • total_withdrawn - Lifetime total withdrawals
  • last_transaction_at - Timestamp of last transaction
  • created_at / updated_at - Timestamps

Transaction Model

Immutable transaction records for audit trail:

from django_cfg.apps.payments.models import Transaction

# Create a transaction (typically done automatically by payment system)
transaction = Transaction.objects.create(
user=user,
transaction_type=Transaction.TransactionType.DEPOSIT,
amount_usd=Decimal('99.99'), # Positive for credit
balance_after=Decimal('199.99'),
description='Payment completed - PAY_20250114_abc'
)

# Query transactions
transactions = Transaction.objects.filter(user=user).order_by('-created_at')

# Transaction properties
print(transaction.is_credit) # True (amount > 0)
print(transaction.is_debit) # False
print(transaction.amount_display) # '+$99.99'
print(transaction.type_color) # 'success' (for UI display)

# Transactions are IMMUTABLE - cannot be modified
# Attempting to modify will raise ValidationError

Transaction Types:

  • DEPOSIT - Cryptocurrency deposit completed
  • WITHDRAWAL - Withdrawal processed
  • PAYMENT - Payment to service/product
  • REFUND - Refund from payment
  • FEE - Service or network fee
  • BONUS - Promotional bonus credit
  • ADJUSTMENT - Manual balance adjustment

Transaction Model Fields:

  • user - ForeignKey to User
  • transaction_type - Type of transaction (see above)
  • amount_usd - Transaction amount (positive=credit, negative=debit)
  • balance_after - User balance after this transaction
  • payment_id - Related payment ID (optional)
  • withdrawal_request_id - Related withdrawal ID (optional)
  • description - Transaction description
  • metadata - JSON field for additional data

WithdrawalRequest Model

Manual withdrawal management with admin approval:

from django_cfg.apps.payments.models import WithdrawalRequest

# User creates withdrawal request
withdrawal = WithdrawalRequest.objects.create(
user=user,
amount_usd=Decimal('50.00'),
currency=Currency.objects.get(code='USDTTRC20'),
wallet_address='TExampleAddress123...',
network_fee_usd=Decimal('1.00'),
service_fee_usd=Decimal('0.50')
)

# Check withdrawal status
print(withdrawal.status) # 'pending'
print(withdrawal.is_pending) # True
print(withdrawal.can_be_cancelled) # True
print(withdrawal.amount_display) # '$50.00 USD'
print(withdrawal.final_amount_usd) # Decimal('48.50') after fees

# Admin approves withdrawal
withdrawal.status = WithdrawalRequest.Status.APPROVED
withdrawal.approved_at = timezone.now()
withdrawal.admin_user = admin_user
withdrawal.save()

# After processing, mark completed
withdrawal.status = WithdrawalRequest.Status.COMPLETED
withdrawal.transaction_hash = 'blockchain_tx_hash'
withdrawal.completed_at = timezone.now()
withdrawal.save()

Withdrawal Status Flow:

  1. PENDING - Awaiting admin review
  2. APPROVED - Approved by admin, ready to process
  3. PROCESSING - Being processed off-platform
  4. COMPLETED - Funds sent, tx_hash recorded
  5. REJECTED - Rejected by admin
  6. CANCELLED - Cancelled by user

WithdrawalRequest Model Fields:

  • user - User requesting withdrawal
  • internal_withdrawal_id - Unique ID (WD_YYYYMMDDHHMMSS_UUID)
  • amount_usd - Withdrawal amount
  • currency - Cryptocurrency to send
  • wallet_address - Destination address
  • network_fee_usd / service_fee_usd / total_fee_usd - Fee breakdown
  • final_amount_usd - Amount after fees
  • status - Withdrawal status
  • transaction_hash - Blockchain tx hash (after sending)
  • admin_user / admin_notes - Admin approval info

Provider Integration

Working with NowPayments Provider

# Direct provider integration for status polling
from django_cfg.apps.payments.services.providers.nowpayments.provider import NowPaymentsProvider
from django_cfg.apps.payments.config import get_nowpayments_config

# Get provider config
config = get_nowpayments_config()
provider = NowPaymentsProvider(config)

# Check payment status
payment = Payment.objects.get(id=payment_id)
if payment.provider_payment_id:
status_data = provider.get_payment_status(payment.provider_payment_id)

# Update payment based on provider response
payment.status = status_data['payment_status']
if status_data.get('actually_paid'):
payment.actual_amount = Decimal(str(status_data['actually_paid']))
payment.save()

Admin Interface Integration

Admin Registration

The admin interface is automatically available for all 5 models:

# Admin interfaces at:
# /admin/payments/payment/ - PaymentAdmin
# /admin/payments/currency/ - CurrencyAdmin
# /admin/payments/userbalance/ - UserBalanceAdmin
# /admin/payments/transaction/ - TransactionAdmin
# /admin/payments/withdrawalrequest/ - WithdrawalRequestAdmin

# Each admin provides:
# - List views with filtering and search
# - Detail views with all field display
# - Custom actions (approve withdrawal, mark completed, etc.)
# - Read-only fields for timestamps and calculated values

Integration Examples

Custom Django Views

Integrate payments into your Django views:

from django.shortcuts import render, redirect
from django.contrib.auth.decorators import login_required
from django_cfg.apps.payments.models import Payment, Currency
from decimal import Decimal

@login_required
def create_deposit(request):
"""Create cryptocurrency deposit payment"""

if request.method == 'POST':
amount = Decimal(request.POST['amount'])
currency_code = request.POST['currency']

# Create payment directly using ORM
payment = Payment.objects.create(
user=request.user,
amount_usd=amount,
currency=Currency.objects.get(code=currency_code),
description=f'Deposit by {request.user.username}'
)

return redirect('payment_detail', payment_id=payment.id)

currencies = Currency.objects.filter(is_active=True)
return render(request, 'create_deposit.html', {
'currencies': currencies
})

@login_required
def payment_detail(request, payment_id):
"""Display payment details with QR code"""

payment = Payment.objects.get(id=payment_id, user=request.user)

return render(request, 'payment_detail.html', {
'payment': payment,
'qr_code_url': payment.get_qr_code_url(size=300),
'explorer_link': payment.get_explorer_link(),
'status_color': payment.status_color,
})

Django REST Framework Integration

Use with DRF serializers and viewsets:

from rest_framework import serializers, viewsets
from django_cfg.apps.payments.models import Payment, UserBalance

class PaymentSerializer(serializers.ModelSerializer):
currency_name = serializers.CharField(source='currency.display_name', read_only=True)
status_display = serializers.CharField(source='get_status_display', read_only=True)

class Meta:
model = Payment
fields = [
'id', 'internal_payment_id', 'amount_usd', 'currency', 'currency_name',
'status', 'status_display', 'pay_address', 'transaction_hash',
'created_at', 'completed_at'
]
read_only_fields = ['internal_payment_id', 'pay_address', 'transaction_hash']

class BalanceSerializer(serializers.ModelSerializer):
class Meta:
model = UserBalance
fields = ['balance_usd', 'total_deposited', 'total_withdrawn', 'last_transaction_at']
read_only_fields = ['__all__']

class PaymentViewSet(viewsets.ReadOnlyModelViewSet):
serializer_class = PaymentSerializer

def get_queryset(self):
return Payment.objects.filter(user=self.request.user)

Key Integration Benefits

Simple ORM Integration

  • Direct Database Access - Use standard Django ORM
  • No Service Layer - Work directly with models
  • Familiar Patterns - Standard Django development
  • Type Safety - Full type hints and validation

Admin Interface

  • 5 Admin Views - Complete management interface
  • Withdrawal Approval - Manual admin workflow
  • Balance Monitoring - User balance tracking
  • Transaction History - Complete audit trail

Balance System

  • Immutable Transactions - Cannot be modified after creation
  • ORM Calculation - Balance computed from transactions
  • Audit Trail - Complete financial history
  • Balance Validation - Prevents negative balances

🔥 Integration Complete!

Your Django application now has full cryptocurrency payment support with ORM-based balance tracking and a complete admin interface!

See Also

Payment System

Core Documentation:

Integration & Development

Payment Integration:

Configuration & Setup

Getting Started:

Advanced:

User Management:

Integrations:

Tools & Deployment

CLI & Testing:

Production: