Получение неправильного запроса 400: Невозможно отправить набор форм с помощью DRF
У меня есть две модели, одна Voucher и другая Journal. Я создал набор форм с помощью django forms для создания ваучера для набора журналов. Каждый ваучер должен содержать как минимум две транзакции журнала. Вот моя модель ниже:
class Voucher(models.Model):
transactions_date = models.DateField(default=now)
voucher_type = models.CharField(max_length=2)
voucher = models.CharField(max_length=50, blank=True, null=True)
narration = models.CharField(max_length=100)
debit = models.DecimalField(max_digits=10, decimal_places=2, default=0)
credit = models.DecimalField(max_digits=10, decimal_places=2, default=0)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
created_by = models.ForeignKey(User,
related_name="+", blank=True, null=True,
on_delete=models.SET_NULL)
updated_by = models.ForeignKey(User,
related_name="+", blank=True, null=True,
on_delete=models.SET_NULL)
is_deleted = models.BooleanField(default=False)
def __str__(self):
return str(self.voucher)
class Meta:
verbose_name = 'Voucher'
verbose_name_plural = 'Vouchers'
default_related_name = 'voucher'
def get_voucher(self):
return self.voucher_type + now().strftime('%Y-%m-%d-' + str(int(self.id)))
def get_debit(self):
transactions = Journal.objects.filter(voucher=self)
total = 0
for item in transactions:
total += item.debit
return total
def get_credit(self):
transactions = Journal.objects.filter(voucher=self)
total = 0
for item in transactions:
total += item.credit
return total
def save(self, *args, **kwargs):
self.voucher = self.get_voucher()
self.debit = self.get_debit()
self.credit = self.get_credit()
super(Voucher, self).save(*args, **kwargs)
class Journal(models.Model):
account = models.ForeignKey('Account', blank=True, null=True, on_delete=models.SET_NULL)
voucher = models.ForeignKey('Voucher', blank=True, null=True, on_delete=models.CASCADE)
debit = models.DecimalField(max_digits=10, decimal_places=2, default=0)
credit = models.DecimalField(max_digits=10, decimal_places=2, default=0)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
created_by = models.ForeignKey(User,
related_name="+", blank=True, null=True,
on_delete=models.SET_NULL)
updated_by = models.ForeignKey(User,
related_name="+", blank=True, null=True,
on_delete=models.SET_NULL)
is_deleted = models.BooleanField(default=False)
def __str__(self):
return self.voucher
class Meta:
verbose_name = 'Journal'
verbose_name_plural = 'Journals'
default_related_name = 'journal'
Я создал сериализаторы для этой модели следующим образом:
class JournalSerializer(serializers.ModelSerializer):
created_by = serializers.CharField(source="created_by.username", read_only=True)
updated_by = serializers.CharField(source="updated_by.username", read_only=True)
created_at = serializers.DateTimeField(format=settings.DATETIME_FORMAT, required=False)
updated_at = serializers.DateTimeField(format=settings.DATETIME_FORMAT, required=False)
class Meta:
model = Journal
fields = ('id', 'account', 'voucher', 'debit', 'credit', 'created_at', 'updated_at', 'created_by', 'updated_by')
class VoucherSerializer(serializers.ModelSerializer):
voucher = JournalSerializer(many=True, read_only=False)
created_by = serializers.CharField(source="created_by.username", read_only=True)
updated_by = serializers.CharField(source="updated_by.username", read_only=True)
created_at = serializers.DateTimeField(format=settings.DATETIME_FORMAT, required=False)
updated_at = serializers.DateTimeField(format=settings.DATETIME_FORMAT, required=False)
class Meta:
model = Voucher
fields = ('id', 'transactions_date', 'voucher_type', 'voucher', 'debit', 'credit', 'narration', 'created_at', 'updated_at', 'created_by', 'updated_by')
def create(self, validated_data):
journal_data = validated_data.pop('voucher')
voucher = Voucher.objects.create(**validated_data)
for journal in journal_data:
Journal.objects.create(voucher=voucher, **journal)
return voucher
Этот набор представлений, который я вызываю через Ajax:
class VoucherViewSet(viewsets.ModelViewSet):
queryset = Voucher.objects.all()
serializer_class = VoucherSerializer
permission_classes = [IsAuthenticated]
def list(self, request, **kwargs):
try:
voucher = query_voucher_by_args(**request.query_params)
serializer = VoucherSerializer(voucher['items'], many=True)
result = dict()
result['data'] = serializer.data
result['draw'] = voucher['draw']
result['recordsTotal'] = voucher['total']
result['recordsFiltered'] = voucher['count']
return Response(result, status=status.HTTP_200_OK, template_name=None, content_type=None)
except Exception as e:
return Response(str(e), status=status.HTTP_404_NOT_FOUND, template_name=None, content_type=None)
def create(self, request, *args, **kwargs):
data = dict()
serializer = self.get_serializer(data=request.data)
if not serializer.is_valid(raise_exception=True):
data['form_is_valid'] = False
data['message'] = serializer.errors #"Form validation error!"
return Response(data, status=status.HTTP_400_BAD_REQUEST)
else:
self.perform_create(serializer)
headers = self.get_success_headers(serializer.data)
data['form_is_valid'] = True
data['message'] = "Successful saved."
return Response(data, status=status.HTTP_201_CREATED, headers=headers)
def perform_create(self, serializer):
serializer.save(created_by=self.request.user, updated_by=self.request.user)
Я получаю эту ошибку: "POST /api/accounting/accounts-journal/create/ HTTP/1.1" 400 172
Я никогда раньше не публиковал набор форм с DRF, любая помощь будет для меня очень полезна.