Как обрабатывать многоформенные данные /form и вложенный сериализатор в django rest framework
У меня есть модель Tender и модель Product. Между моделями Tender и Product существует отношение внешнего ключа. Теперь я хочу обновить экземпляр тендера, в котором я предоставляю данные о тендере и продукте. Формат данных - multipart/form-data. Но каждый раз получаю следующую ошибку
{ "продукты": [ "Это поле обязательно для заполнения". ] }
Я предоставляю код, чтобы вы, ребята, могли понять все правильно
Это класс представления
@extend_schema(tags=[OpenApiTags.TMS_TENDER])
class TenderUpdateView(generics.UpdateAPIView):
permission_classes = []
queryset = Tender.objects.all()
serializer_class = TenderPreSubmissionSerializer
lookup_field = "id"
parser_classes = [MultiPartParser]
def get_queryset(self):
id = self.kwargs.get("id")
return Tender.objects.filter(id=id)
Это сериализатор
class TenderPreSubmissionSerializer(serializers.ModelSerializer):
products = ProductSerializer(many=True)
class Meta:
model = Tender
fields = [
"products",
"is_open",
"procuring_entity",
"ministry",
"bg_amount",
"bg_attachment",
"bg_issue_date",
"bg_validity_date",
"is_bg_extended",
]
def update(self, instance, validated_data):
# Extract products data
products_data = validated_data.pop("products")
# Update tender instance
instance = super().update(instance, validated_data)
# Create a mapping of existing products by ID
existing_products = {product.id: product for product in instance.products.all()}
# Update or create products
for product_data in products_data:
product_id = product_data.get("id")
if product_id and product_id in existing_products:
# Update existing product
product = existing_products.pop(product_id)
for attr, value in product_data.items():
setattr(product, attr, value)
product.save()
else:
# Create new product
Product.objects.create(**product_data)
# Delete products that are not in the new list
for product in existing_products.values():
product.delete()
return instance