Как сериализовать поле ManyToManyField
Я хочу сериализовать ManyToManyField, но в то же время я ищу что-то, что обновляет его с помощью ModelViewSet. Я могу сериализовать его, но когда я обновляю его, я не могу этого сделать. Я знаю, что могу сделать отдельный API для этого, но из-за некоторых требований мне нужно придерживаться одной конечной точки. Вот мой код
class ComponentSerializers(serializers.ModelSerializer):
class Meta:
model = coreModel.Component
fields = '__all__'
class MonitorSerializers(serializers.ModelSerializer):
device = ComponentSerializers(read_only=True, many=True)
class Meta:
model = models.Monitor
fields = '__all__'
read_only_fields = ('id', 'created_at', 'updated_at',)
и views.py является
class MonitorViewSet(viewsets.ModelViewSet):
authentication_classes = (authentication.TokenAuthentication,)
permission_classes = (permissions.IsAuthenticated,)
queryset = models.Monitor.objects.all()
filter_backends = (DjangoFilterBackend,OrderingFilter,SearchFilter)
filter_class = superFilter.MonitorFilters
serializer_class = serializers.MonitorSerializers
Если вы хотите обновить ManytoMany или связанные объекты
Override
def update(self, validated_data):
в MonitorSerializers
class MonitorSerializers(serializers.ModelSerializer):
def update(self, instance, validated_data):
# Remove component data and save in variable
iscomponentdataexists = 'device' in validated_data
if iscomponentdataexists :
componentdata= validated_data.pop('device')
instance = super().update(instance, validated_data) # Update Monitor Data
# looping through instance.device(Existing data) and new componentdata in parallel
if iscomponentdataexists :
for device, deviceinstance in zip(componentdata, instance.device.all()):
for attr, value in device.items():
# Assigning values from New data
setattr(deviceinstance, attr, value)
deviceinstance.save() # Saving Changes
return instance
Удалите read_only=True с устройства