class Vendor(models.Model):
...
class Module(models.Model):
MODULES_NAME = (
("Sourcing", "Sourcing"), ("SA", "SA"),
("SXM", "SXM"), ("CLM", "CLM"),
...
)
name = models.CharField(max_length=50, choices=MODULES_NAME)
is_active = models.BooleanField(default=True)
class VendorModule(models.Model):
vendor = models.ForeignKey(Vendor, on_delete=models.CASCADE)
module = models.ForeignKey(Module, on_delete=models.CASCADE)
is_active = models.BooleanField(default=True)
info1 = models.TextField(max_length=500)
info2 = models.TextField(max_length=500)
VendorModule
— фактически это связь многие-ко-многим с возможностью сохранения дополнительной информации. Назначение модели Element
непонятно, поэтому дополнительная информация убрана в VendorModule
. Но если вы считаете, что этого недостаточно, то можно сделать так:class Element(models.Model):
vendormodule = models.ForeignKey(VendorModule, on_delete=models.CASCADE)
info1 = models.TextField(max_length=500)
info2 = models.TextField(max_length=500)
from drf_writable_nested.serializers import WritableNestedModelSerializer
class VendorContactSerializer(serializers.ModelSerializer):
class Meta:
model = VendorContacts
fields = (
'contact_name',
'phone',
'email',)
class VendorModulSerializer(serializers.ModelSerializer):
class Meta:
model = VendorModuleNames
fields = ('module',)
class VendorsSerializer(WritableNestedModelSerializer):
vendorcontact = VendorContactSerializer(source='vendor.vendorcontacts', many=True)
vendormodulenames = VendorContactSerializer(source='vendor.vendormodulenames', many=True)
class Meta:
model = Vendors
fields = ('vendor_name',
'country',
'nda',
'parent_vendor',)
VendorsSerializer
в классе CsvToDatabase
заточен на приём данных для одного объекта, а вы передаёте в него список объектов. Варианта два: или передавать с фронта на бэк каждый объект отдельным запросом, или делать CsvToDatabase
способным обработать список объектов.class CsvToDatabase(APIView):
def post(self, request, format=None):
for key, data_item in request.data.items():
serializer = VendorsSerializer(data=data_item)
...
filename[-4:]
расширение файла лучше получать так: os.path.splitext(filename)
. Ну или проверку делать так if filename.endswith('.csv')
. def handler(request, *args, **kwargs) -> HttpResponse:
pass
l = [value for value in vehicles_data_to_add.values() if isinstance(value, dict) ]