Как сериализовать поле 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 с устройства

Вернуться на верх