DTO в Django Python? - PullRequest
       65

DTO в Django Python?

0 голосов
/ 27 мая 2020

Итак, я начинаю изучать Django и хочу создать с его помощью Rest API. Я в основном исхожу из. Net фона.

Я знаю, что Python соглашения сильно отличаются от Net, и я это хорошо понимаю, но, с моей точки зрения, я вижу много избыточности и отсутствие стандартов (Solid) при разработке приложения в Django. Поэтому я придумал свой собственный лучший стандарт.

Вот моя иерархия проектов.

 [DjangoProject]:
    [Finance]:
       admin.py
       apis.py
       services.py
       test.py
       urls.py
       models.py
    [Users]:...

apis.py -> Каждый API будет иметь свой класс

class ReportCreateApi(APIView):
    class InputSerializer(serializers.Serializer):
        title = serializers.CharField()
        description = serializers.CharField()
        pictures = serializers.CharField()
        lat = serializers.CharField()
        long = serializers.CharField()
        vote = serializers.CharField()

    def post(self, request):
        serializer = self.InputSerializer(data=request.data)
        serializer.is_valid(raise_exception=True)

        ReportService.ireport_create(**serializer.validated_data)
        return Response(status=status.HTTP_201_CREATED)

services.api -> Services будут иметь ** kwargs в качестве параметров

class ReportService:
    @staticmethod
    def ireport_create(**report) -> Report:

        logger.info('Creating IReport')

        ireport = Report(**report) #Report is a modal btw
        ireport.save()
        return ireport

Хотя сейчас это работает, мне это не подходит. При этом любой может передать неограниченное количество параметров, которые могут не ожидаться службами.

Каким будет лучший подход для передачи параметров в service из api, чтобы я мог сопоставить их с модель при создании внутри сервиса?

PS:. Net пример

/*"Finance" as a domain layer*/
public class BookKeeping
{
    private String aVariable{get; set;}

    public void doAccounts(TakeInputDto input)
    {
        //Doing something productive
    }
}

/*"GatewayAPI" as API layer*/
public class FinanceAPI: Controller
{
    //Constructor with dependency Injection is here not you can't see it.

    public void CalculateTax()
    {
        _bookKeeping.doAccounts(Dto will take some accepted values)
    }
}

Что эквивалентно TakeInputDto в Python ?

...