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.9.1.tar.gz (7.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.9.1-py3-none-any.whl (8.2 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: django_ddd_template-0.9.1.tar.gz
  • Upload date:
  • Size: 7.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.9.1.tar.gz
Algorithm Hash digest
SHA256 b0e48cb9c2036c6fbfcb14ad65062fa49d60e9cbaeae0343f85ae1eac601b953
MD5 46c87e15e4781cff1a473decb76f28ad
BLAKE2b-256 9f47bf320136af467578946db78e4bf11fb60a91903415c0b356e6f15f36dcc8

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for django_ddd_template-0.9.1-py3-none-any.whl
Algorithm Hash digest
SHA256 7cc0eb059a64e6817a5241c6943a3e753010c02f5ba860c6424feccb56f76b98
MD5 fa3e1d153954efb3ff73da9c1a911d96
BLAKE2b-256 806bff0b2a22eb9933dde920c32bd3e5f6358c0c0f12748dbf267b7d41cf4221

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