#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