Skip to main content

Crea apps Django con arquitectura DDD

Project description

🧠 Arquitectura Basada en DDD para Django Rest Framework

🚀 Instalación

Puedes instalarlo directamente desde PyPI:

pip install django-ddd-template

🚀 Después de instalar el paquete, puedes usar el siguiente comando para generar una app con estructura DDD:

django-ddd startapp <nombre_de_la_app>

📦 Estructura General

Esta estructura está basada en los principios de Domain-Driven Design (DDD) aplicada con Django + Django Rest Framework.


entity_app/
├── domain/
│   ├── entities/           # Entidades del dominio
│   ├── events/             # Eventos de dominio
│   ├── repositories/       # Interfaces de repositorios
│   └── services/           # Lógica de negocio
├── infrastructure/
│   ├── models/             # Modelos ORM
│   ├── repositories/       # Repositorios concretos
│   ├── serializers/        # Serializadores DRF
│   ├── views/              # Vistas DRF
│   └── urls.py             # Enrutamiento de la app
├── migrations/             # Migraciones Django
├── apps.py                 # Configuración de la app
├── models.py               # Opcional si se usa infraestructura/models
└── tests/                  # Pruebas unitarias

🧱 Ejemplo de Implementación

Dominio

Entidad

# domain/entities/entity.py
class Entity:
    def __init__(self, id, name, value):
        self.id = id
        self.name = name
        self.value = value

Repositorio (interfaz)

# domain/repositories/entity_repository.py
from abc import ABC, abstractmethod

class EntityRepository(ABC):
    @abstractmethod
    def get_by_id(self, entity_id): pass

    @abstractmethod
    def save(self, entity): pass

Servicio

# domain/services/entity_service.py
from entity_app.domain.entities.entity import Entity

class EntityService:
    def __init__(self, repository):
        self.repository = repository

    def register_entity(self, name, value):
        entity = Entity(None, name, value)
        return self.repository.save(entity)

Infraestructura

Modelo

# infrastructure/models/entity_model.py
from django.db import models

class EntityModel(models.Model):
    name = models.CharField(max_length=255)
    value = models.IntegerField()

Repositorio (implementación)

# infrastructure/repositories/django_entity_repository.py
from entity_app.domain.entities.entity import Entity
from entity_app.domain.repositories.entity_repository import EntityRepository
from entity_app.infrastructure.models.entity_model import EntityModel

class DjangoEntityRepository(EntityRepository):
    def get_by_id(self, entity_id):
        model = EntityModel.objects.get(id=entity_id)
        return Entity(model.id, model.name, model.value)

    def save(self, entity):
        model = EntityModel(name=entity.name, value=entity.value)
        model.save()
        entity.id = model.id
        return entity

Serializador

# infrastructure/serializers/entity_serializer.py
from rest_framework import serializers
from entity_app.infrastructure.models.entity_model import EntityModel

class EntitySerializer(serializers.ModelSerializer):
    class Meta:
        model = EntityModel
        fields = ['id', 'name', 'value']

Vista

# infrastructure/views/entity_view.py
from rest_framework import viewsets
from entity_app.infrastructure.models.entity_model import EntityModel
from entity_app.infrastructure.serializers.entity_serializer import EntitySerializer

class EntityViewSet(viewsets.ModelViewSet):
    queryset = EntityModel.objects.all()
    serializer_class = EntitySerializer

URLs

# infrastructure/urls.py
from django.urls import path, include
from rest_framework.routers import DefaultRouter
from entity_app.infrastructure.views.entity_view import EntityViewSet

router = DefaultRouter()
router.register(r'entities', EntityViewSet)

urlpatterns = [
    path('', include(router.urls)),
]

✅ Pruebas

# tests/test_entity_service.py
import unittest
from entity_app.domain.services.entity_service import EntityService
from entity_app.domain.entities.entity import Entity

class InMemoryEntityRepository:
    def __init__(self):
        self.data = {}
        self._id_counter = 1

    def get_by_id(self, entity_id):
        return self.data.get(entity_id)

    def save(self, entity):
        entity.id = self._id_counter
        self.data[self._id_counter] = entity
        self._id_counter += 1
        return entity

class EntityServiceTestCase(unittest.TestCase):
    def test_register_entity(self):
        repo = InMemoryEntityRepository()
        service = EntityService(repo)

        entity = service.register_entity("Example", 100)

        self.assertIsNotNone(entity.id)
        self.assertEqual(entity.name, "Example")
        self.assertEqual(entity.value, 100)

if __name__ == '__main__':
    unittest.main()

▶️ Ejecución de Pruebas

python manage.py test entity_app.tests.test_entity_service

📌 Notas

  • Se recomienda inyectar las dependencias (repositorios) desde vistas o gestores.
  • Puedes extender services con lógica más compleja según tus reglas de negocio.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

django_ddd_template-0.7.tar.gz (6.3 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

django_ddd_template-0.7-py3-none-any.whl (6.3 kB view details)

Uploaded Python 3

File details

Details for the file django_ddd_template-0.7.tar.gz.

File metadata

  • Download URL: django_ddd_template-0.7.tar.gz
  • Upload date:
  • Size: 6.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.9.13

File hashes

Hashes for django_ddd_template-0.7.tar.gz
Algorithm Hash digest
SHA256 d679be94350f06885d272f3290bafb0d10b2b2e7325f903809578a012344af67
MD5 f3d639473f4f75ab1120c40f45319e1e
BLAKE2b-256 618d30f3b1904c20916c8e9db850c92374a81a5eb1a288c283e25fa3729b46a9

See more details on using hashes here.

File details

Details for the file django_ddd_template-0.7-py3-none-any.whl.

File metadata

File hashes

Hashes for django_ddd_template-0.7-py3-none-any.whl
Algorithm Hash digest
SHA256 a3ff1dd68d701571f7d9166e5254daeb7a70730933ed082d677175efda581a22
MD5 f533498e66212ea9547dc22603bc4780
BLAKE2b-256 1ad2ef5f54bf54bdfab2e9d9e581421999568d3e697060b0e8e91057de198197

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page