I am trying to add multiple ManytoMany relationship in a model but when I am trying to add the data it shows OrderedDict() in the validated data in serializer
Models.py
class Client(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE, primary_key=True)
client_name = models.CharField(max_length=500, default=0)
client_shipping_address = models.CharField(max_length=500, default=0,blank=True, null=True)
class Group(models.Model):
emp = models.ForeignKey(Employee, on_delete=models.CASCADE) #try user
name = models.CharField(max_length=500, default=0)
groupmodels = models.ManyToManyField(GroupModels)
sender_clients = models.ManyToManyField(Client)
receiver_clients = models.ManyToManyField(ReceiverClient)
warehouses = models.ManyToManyField(Warehouse)
Views.py
class GroupsCreateAPIView(CreateAPIView):
permission_classes = (permissions.IsAuthenticated,)
def post(self, request, *args, **kwargs):
d = request.data.copy()
print(d)
serializer = GroupsSerializer(data=d)
if serializer.is_valid():
serializer.save()
print("Serializer data", serializer.data)
return Response(serializer.data, status=status.HTTP_201_CREATED)
else:
print('error')
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
Serilalizer.py
class GroupSenderClientSerializer(serializers.ModelSerializer):
class Meta:
model = Client
fields = "__all__"
read_only_fields = ('user',)
class GroupsSerializer(serializers.ModelSerializer):
groupmodels = GroupModelsSerializer(many=True)
sender_clients = GroupSenderClientSerializer(many=True)
receiver_clients = ReceiverClientSerializer(many=True)
warehouses = WarehouseSerializer(many=True)
class Meta:
model = Group
fields = "__all__"
def create(self, validated_data):
print("v data", validated_data)
items_objects = validated_data.pop('groupmodels', None)
sc_objects = validated_data.pop('sender_clients', None)
rc_objects = validated_data.pop('receiver_clients', None)
ware_objects = validated_data.pop('warehouses', None)
prdcts = []
sc = []
rc = []
ware = []
for item in items_objects:
i = GroupModels.objects.create(**item)
prdcts.append(i)
instance = Group.objects.create(**validated_data)
print("sc objects", sc_objects)
if len(sc_objects)>0:
for i in sc_objects:
print("id", i['id'])
inst = Client.objects.get(pk=i['id'])
sc.append(inst)
if len(rc_objects)>0:
for i in rc_objects:
inst = ReceiverClient.objects.get(pk=i['id'])
rc.append(inst)
if len(ware_objects)>0:
for i in ware_objects:
inst = Warehouse.objects.get(pk=i['id'])
ware.append(inst)
instance.groupmodels.set(prdcts)
instance.sender_clients.set(sc)
instance.receiver_clients.set(rc)
instance.warehouses.set(ware)
return instance
The initial data in the serializer is like the following
initial_data = {'name': '546', 'emp': 14, 'sender_clients': [{'id': 3}, {'id': 4}], 'receiver_clients': [], 'warehouses': [], 'groupmodels': []}
validated_data = {'groupmodels': [], 'sender_clients': [OrderedDict(), OrderedDict()], 'receiver_clients': [], 'warehouses': [], 'name': '546', 'emp': <Employee: Employee object (14)>}
Please help me figure out why the sender_clients is converted to blank dicts and how do I change it?
read_only_fields = ('user', )Can you do this and try again?