Лучший способ сохранить данные в базе данных с помощью сериализатора django

#python #django #django-rest-framework

Вопрос:

Здравствуйте, я работаю над проектом, в котором делаю сериализаторы и отправляю почтовые запросы с помощью почтальона. Это работает нормально, но это очень маленькая часть приложения, и код вырастет до очень большого размера. Если есть лучший способ сделать это, в котором я пишу меньший код, то я хотел бы использовать его. Прямо сейчас я сохраняю информацию следующим образом

models.py

 class Services(models.Model):
    business = models.ForeignKey(Business, on_delete=models.CASCADE)
    service = models.CharField(max_length=30, blank=True)
 

serializers.py

 class ServiceSerializer(serializers.ModelSerializer):
    class Meta:
        model = Services
        fields = ('id', 'business', 'service')
 

views.py

 class ServiceAPIView(APIView):
    permission_classes = [IsAuthenticated]

    def post(self, request):
        data = request.data

        business = Business.objects.get(user=request.user)
        data['business'] = business.pk
        serializer = BusinessSerializer(data=data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=status.HTTP_200_OK)

        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
 

urls.py

 urlpatterns = [
    path('service/', ServiceAPIView.as_view()),
]
 

Отредактированный*

Вот бизнес-модель

 class Business(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)

    business_name = models.CharField(max_length=50, blank=True)

    invoices_terms = models.TextField(max_length=100, blank=True)
    desc = models.TextField(max_length=1000, blank=True)

    website = models.URLField(max_length=200, blank=True)

    tax_percentage = models.DecimalField(blank=True, max_digits=5, decimal_places=3)
    labour_rate_per_hour = models.DecimalField(blank=True, max_digits=5, decimal_places=2)

    tax_hst_number = models.IntegerField(blank=True)
 

Комментарии:

1. Возможно, вы неправильно назвали BusinessAPIView как SeriveAPIView. Вы тоже можете показать свою бизнес-модель ?

2. Нет, я упомянул неправильный шаблон URL-адреса, я обновлю его, а также дам вам бизнес-модель. Есть ли способ сделать это с помощью ModelViewSet?

Ответ №1:

Ну, код выглядит нормально, и также нормально иметь глубокие модули.

Небольшое обновление может заключаться в следующем:

 class ServiceAPIView(APIView):
    permission_classes = [IsAuthenticated,]
    serializer_class = ServiceSerializer
    def post(self, request):
        data = request.data
        business = Business.objects.get(user=request.user)
        data['business'] = business.pk
        serializer = self.get_serializer(data=data)
        serializer.is_valid(raise_exception=True):
        serializer.save()
        return Response(serializer.data, status=status.HTTP_200_OK)
 

Таким образом, вы можете написать только одну строку ответа для каждого метода запроса на просмотр и не использовать операторы if/else